欢迎光临
我一直在努力开车

Twitter批量获取关注用户(二)

引子

上一篇 说到,用Twitter API批量获取关注用户受到了访问频率的限制,如果获取的用户量少(大概少于2000)倒还好,如果关注者在5000以上,那么:一是不干了;二是使用修改版,等上几个小时,说不定就能获取完毕。

而我,上面两个选择都不是最佳选择,于是干脆自己写脚本批量获取关注用户。

模拟登陆

打开一个Twitter用户的关注列表,比如twitter.com/artnet/followers

oooops,,,居然要登录才能看到关注用户,好吧,那就只能先模拟登陆才行了(当然直接用浏览器复制出来的cookies也行)。

1.首先先看看登录Twitter提交了什么数据

在登录前打开Chrome开发者工具
tips: 点击Preserve log,可以保存network信息,否则页面刷新了,之前的提交数据就没了


从图中可以看到,登录时是向https://twitter.com/sessions POST提交的数据。

再看看提交了什么数据

  session[username_or_email]:xxxxx
  session[password]:xxxxx
  authenticity_token:a65fd349d41b7ac4fd17ca77b4c948524087d1f8
  ui_metrics:{"rf":{"a4d6b278630dbf12c62f4c99afe674f88098a2e667594fdc6fbdc270342ecb5e":0,"aa10e8e4ce87cb44778ef3412c838771ca77dc71f45ed09610eadb7d6b0c2041":14,"a35caffd051b0691c758e994f627c2871d54791e6d37f64906500d8818a1958d":66,"a7a3bf4e2d74e304823c0876a68958993543e5e00f66c097d646715bfcb3c249":90},"s":"smEd4LQWUaUOXZGaV-S3CCyEi4l9B-Wae-_SWpTFh4EhzBTnRr-2waoUEWU2JtsGUb403RfzrP_YaWMx40cuGpv8Q9L5XVq5nWEWH1n2Er9QQbOLNCkw2nuvxTfI6GkLtFdxrF6x4Tng3tiUCKqw-6YmilLKyycTRx7etdoyhaoE8gnL2KbHlYyfD0nfrm9iYhOZF6-SX7nJm0dCsyUSx6tpsT_k7IvhZwE-QX00FT0TLkdZjckvVqsIZOIxvapL2hyoI8IsZfmksLQaMloFgneOTUj7_B8XOhKOiCy6GbwN9PF1yUePbTpFQtBHZ76g5skKW57T7zarlbVYH4VD6wAAAWPySOpa"}
  scribe_log:
  redirect_after_login:/artnet/followers
  remember_me:1
  • session[username_or_email]:就是用户名或者邮箱或者号码
  • session[password]:就是密码(明文,未加密)
  • authenticity_token:???
  • ui_metrics:???

最主要的是上面4个参数,前两个没什么好说的,后面两个是什么呢?一般来说,直接在登录页面源码里面找就行了

2.查找提交数据来源

– authenticity_token

打开Twitter登录页:https://twitter.com/login

CTRL+U查看源码

再按CTRL+F搜索authenticity_token

嘿!真找到了!

authenticity_token直接正则提取出来就好了

– ui_metrics

同样的步骤,搜索ui_metrics

ui_metrics值没找到,但是找到了相关的一个js代码:https://twitter.com/i/js_inst?c_name=ui_metrics

直接查看一下js的内容

原来ui_metrics的数据就在这里面,但是好像做了一点处理,需要把rf里面的键值对中的值从同一个js中提取出来

3.开始模拟登陆

提交的网址、提交的数据都有了,然后就可以愉快的模拟登陆了。

具体的代码就不贴了,有兴趣的按照我上面的流程走一遍就能搞定。

顺便说一下,模拟登陆的时候headers最好带上Referer,否则可能会有问题

获取关注用户

打开一个Twitter用户的关注列表,比如twitter.com/artnet/followers

一直往下拉往下拉,twitter是通过ajax异步加载的关注者,加载的地址是:

https://twitter.com/{username}/followers/users?include_available_features=1&include_entities=1&max_position={position}&reset_error_state=false

其中:

username 就是要获取的twitter用户

position 应该就是类似page的分页系数

同样从源码中找一下position这个参数

可以看到有data-min-position这个参数,那么这个参数就是就是下一页关注者的参数。

然后继续看,上面的api地址加载的数据有哪些?

has_more_items 是否有更多项

items_html 本次加载的关注者html源码,可以通过xpath/正则提取关注者

min_position 就是加载下一页关注者用到的参数

显而易见,只要循环获取这个api地址,就能获取到一个twitter用户下的所有关注者。



但是如果你以为事情就这样结束了,那就可能想的太简单了。因为这个api也有频率限制

所以这个想通过这个api获取所有关注者的想法也破灭了

放弃吧!!!


等等,不是有个max_position参数吗?我直接在twitter.com/artnet/followers 后面带上max_position可不可以?试试!

访问:twitter.com/artnet/followers?max_position=1603118831720174447 发现还真可以!!接下来该怎么做就不用我说了吧!

赞(0)
未经允许不得转载:一个人的公交 » Twitter批量获取关注用户(二)

评论 9

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

    老哥,代码可否参考参考,最近这个问题搞得头都大了.在下跪谢了啊………..

    Arjun 5个月前 (11-08) 这家伙可能用了美佬的代理 谷歌浏览器 Windows 10 回复
    • @Arjun 代码没保存

      Abbey 5个月前 (11-09) 这家伙可能用了美佬的代理 谷歌浏览器 Windows 7 回复
  2. #2

    可以加个qq,微信指导下吗?或者你写一套我愿意购买,谢谢.

    Arjun 5个月前 (11-10) 这家伙可能用了美佬的代理 谷歌浏览器 Windows 10 回复
    • @Arjun QQ群:187123200,私聊群主

      Abbey 5个月前 (11-10) 这家伙可能用了美佬的代理 谷歌浏览器 Windows 10 回复
  3. #3

    老哥,想问下,为什么我在源码里没有看到“data-min-position”呢?

    wenjing 5个月前 (12-03) 这家伙可能用了美佬的代理 谷歌浏览器 Windows 10 回复
    • @wenjing 搜position

      Abbey 4个月前 (12-05) 来自天朝的朋友 谷歌浏览器  MIX 2 Build/OPR1.170623.027) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 YaBrowser/18.9.0.486.00 Mobile Safari/537.36 回复
      • @Abbey 大哥,为什么把我看到的源代码长这样?

        Twitter

        body {
        background-color: #ffffff;
        font-family: sans-serif;
        }
        a {
        color: #1da1f2;
        }
        svg {
        color: #1da1f2;
        display: block;
        fill: currentcolor;
        height: 21px;
        margin: 13px auto;
        width: 24px;
        }

        <center>如果你的页面没有很快跳转,请<a href="https://www.abbeyok.com/go/?url=/artnet/followers">使用这个链接</a>。</center>
        </noscript>

        document.cookie = "app_shell_visited=1;path=/;max-age=5";

        location.replace(location.href.split("#")[0]);

        wenjing 4个月前 (12-05) 来自天朝的朋友 谷歌浏览器 Windows 10 回复
        • @wenjing 你被防爬虫了吧

          Abbey 4个月前 (12-05) 来自天朝的朋友 谷歌浏览器 Windows 7 回复
          • @Abbey 诶嘿,您看到的不是这样的吗?我一直以为data-min-position是异步加载得到的呢。

            wenjing 4个月前 (12-05) 来自天朝的朋友 谷歌浏览器 Windows 10

Onedrive个人网盘搭建

GitHub地址联系Abbey