V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
oIMOo
V2EX  ›  Python

Python 如何实现 onclick/button 背后的 POST

  •  
  •   oIMOo · 2018-03-14 10:12:31 +08:00 · 5068 次点击
    这是一个创建于 2474 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前正在写一个方便自己进行预约的脚本,查找最满意时间等步骤已经完成,但是最后提交不知道该如何进行,特来求助。

    真实环境步骤:

    • 点击需选定时间
    • 点击弹出对话框的确认
    • 完成预约

    选定时间 (按钮) 代码:

    <a class='dispo' type='button' href='javascript:void(0)' onclick='ajaxCall("ajax_form_status", "https://url")'>23:55</a>
    

    点击时间后 POST 内容 (by Burp):

    url=https%3A%2F%2Furl&some_data
    

    点击确认后 POST 内容 (by Burp):

    other_data
    

    代码实现过程中,有如下困难:

    • 最后一次确认没有 url,如何 POST ?

    附:代码使用 requests package。

    谢谢

    第 1 条附言  ·  2018-03-15 08:43:28 +08:00
    ## 点击时间后,Firefox Developer Tools 给出的 Post 内容:

    https://fr.tlscontact.com/country/city/action.php?process=multiconfirm&what=take_appointment&fg_id= 66666666666&result=dateandtime&issuer_view=countrycity2fr&issuer_view=&target=ajax_form_status&time=now&_sid=bazhahei


    ## 同操作 Burp 给出的 Post 内容:

    POST /country/city/ajax/confirm_action.php HTTP/1.1
    Host: fr.tlscontact.com
    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:58.0) Gecko/20100101 Firefox/58.0
    Accept: text/javascript, text/html, application/xml, text/xml, */*
    Accept-Language: en-US,en;q=0.5
    Referer: https://fr.tlscontact.com/country/city/myapp.php?fg_id=66666666666
    X-Requested-With: XMLHttpRequest
    X-Prototype-Version: 1.7
    Content-type: application/x-www-form-urlencoded; charset=UTF-8
    Content-Length: 281
    Cookie: TLScontact=biu; uid=blah; _ga=mua; _gid=pia; TLScontact=duang
    Connection: close

    https://fr.tlscontact.com/country/city/action.php?process=multiconfirm&what=take_appointment&fg_id= 66666666666&result=dateandtime&issuer_view=countrycity2fr&issuer_view=&target=ajax_form_status&time=now&_sid=bazhahei

    ## 点击弹出框框中的确认按钮后,Burp 给出的内容:

    POST /country/city/action.php HTTP/1.1
    Host: fr.tlscontact.com
    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:58.0) Gecko/20100101 Firefox/58.0
    Accept: text/javascript, text/html, application/xml, text/xml, */*
    Accept-Language: en-US,en;q=0.5
    Referer: https://fr.tlscontact.com/gb/LON/myapp.php?fg_id= 66666666666
    X-Requested-With: XMLHttpRequest
    X-Prototype-Version: 1.7
    Content-type: application/x-www-form-urlencoded; charset=UTF-8
    Content-Length: 170
    Cookie: TLScontact= biu; uid= blah; _ga=mua; _gid= pia; TLScontact= duang; _dc_gtm_UA-28256030-1=1
    Connection: close

    f_id=&fg_id= 66666666666&what=take_appointment&result=dateandtime&as_u_id=&_sid= bazhahei&process=multiconfirm&reloader_timestamp=(now+1s)

    以上值替换了 ID 之类的数据,所以我如果相约这个时间,道到底应该 post 什么呢?

    这 [脏话] 网站,定了预约不能自行立即取消,最后一步不能盲目测试啊……
    16 条回复    2018-03-16 01:03:25 +08:00
    limerence12138
        1
    limerence12138  
       2018-03-14 10:17:06 +08:00 via Android
    这些 time 不应该都是时间戳嘛
    manzhiyong
        2
    manzhiyong  
       2018-03-14 10:24:26 +08:00
    oIMOo
        3
    oIMOo  
    OP
       2018-03-14 10:30:23 +08:00
    @ql936611560

    这点确实,太晚脑子不转了……

    int(time.time() * 1000) 可以实现模拟,所以已经把这点从原文里删掉了。

    谢谢。
    oIMOo
        4
    oIMOo  
    OP
       2018-03-14 10:34:15 +08:00
    @manzhiyong

    这个网站不错,谢谢,收藏了。

    不过没有 URL 的 POST 这里面没有提到呀。

    我看有人使用 from selenium import webdriver 实现,不过想知道能不能通过 requests 的 post 实现,毕竟我不是要下载文件。
    Yourshell
        5
    Yourshell  
       2018-03-14 10:37:28 +08:00 via iPhone
    没 url 网页是怎么 post 的?
    oIMOo
        6
    oIMOo  
    OP
       2018-03-14 10:39:28 +08:00
    @Yourshell Burp 抓到的就是一些 Data。
    locoz
        7
    locoz  
       2018-03-14 13:14:52 +08:00 via Android
    没有加密环节的话直接看抓到的包就好了 没有 url 的话说明那一步本来就是废的
    Va1n3R
        8
    Va1n3R  
       2018-03-14 15:53:21 +08:00
    都用 burp 了...黑阔吗?没有 URL 怎么 post 传输呢?直接用 burp 的 repeat 重放,一般只有一个请求才是重要的,没有必要模拟所有动作。
    oIMOo
        9
    oIMOo  
    OP
       2018-03-14 16:24:30 +08:00
    @locoz 用 Burp 测的时候,两次操作都需要 forward 才可以,drop 掉任何一个都不行。 我尝试将第二个也发往同样的 url,并没有成功预约到......
    oIMOo
        10
    oIMOo  
    OP
       2018-03-14 16:25:57 +08:00
    @Va1n3R 直接 firefox 抓的话,我没办法 drop 掉那个 post 包。

    我在想会不会是要将两次的 data 一股脑一次发过去,晚上下班回家试试。
    locoz
        11
    locoz  
       2018-03-15 07:57:48 +08:00 via Android
    @oIMOo #9 方便的话可以直接把网站发出来
    locoz
        12
    locoz  
       2018-03-15 07:58:25 +08:00 via Android
    @oIMOo 看实际情况效率会高很多
    oIMOo
        13
    oIMOo  
    OP
       2018-03-15 08:32:39 +08:00
    oIMOo
        14
    oIMOo  
    OP
       2018-03-15 08:45:03 +08:00
    @ql936611560 @manzhiyong @Yourshell @locoz @Va1n3R

    各位,我发出了两次详细的 Post 内容,求指导我想约的话,到底应该怎么 POST 呢?

    谢谢
    oIMOo
        15
    oIMOo  
    OP
       2018-03-15 09:23:37 +08:00
    @ql936611560 @manzhiyong @Yourshell @locoz @Va1n3R

    我突然意识到我被 data 里面的一个 url 弄晕了,实际两个都是有 POST 的 url 的……

    我试着模拟了一下,暂时没有成功。

    两层上面的 github 链接里面的 get_appointment 方程。 其它均测试过没有问题。

    发了太多次链接,被警告了……
    oIMOo
        16
    oIMOo  
    OP
       2018-03-16 01:03:25 +08:00
    添加了临时方案,邮件通知提醒。

    周末网上搜个护照试试真实 POST 是什么样子
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2780 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 02:51 · PVG 10:51 · LAX 18:51 · JFK 21:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.