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 发现还真可以!!接下来该怎么做就不用我说了吧!

本文作者:Abbey

本文链接:https://www.abbeyok.com/archives/32

版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0许可协议。转载请注明出处!

Twitter批量获取关注用户(一)... <<
13 条评论
  1. author
    2019-09-02
    Abbey
    2019-09-02
    Zoe
    想问下大神,这套逻辑现在是不是不能用了啊...

    不知道啊,好久没关注了,之前听人说变了

  2. author
    2019-09-02
    Zoe

    想问下大神,这套逻辑现在是不是不能用了啊?我按这个流程走了一遍,依旧登录不上去QAQ

  3. author
    2019-06-26
    Abbey
    2019-06-19
    Zoe
    "原来ui_metrics的数据就在这里...

    正则匹配

  4. author
    2019-06-19
    Zoe

    "原来ui_metrics的数据就在这里面,但是好像做了一点处理,需要把rf里面的键值对中的值从同一个js中提取出来"
    没太懂这是怎么做的处理呢?js文件里的键值对的值是字符串,但是post提交的表单是数字,是怎么转化的呢?

  5. author
    2018-12-05
    wenjing
    2018-12-05
    Abbey
    你被防爬虫了吧...

    诶嘿,您看到的不是这样的吗?我一直以为data-min-position是异步加载得到的呢。

  6. author
    2018-12-05
    Abbey
    2018-12-05
    wenjing
    大哥,为什么把我看到的源代码长这样? T...

    你被防爬虫了吧

  7. author
    2018-12-05
    wenjing
    2018-12-05
    Abbey
    搜position...

    大哥,为什么把我看到的源代码长这样?





    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="/artnet/followers">使用这个链接</a>。</center>
    </noscript>


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

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




  8. author
    2018-12-05
    Abbey
    2018-12-03
    wenjing
    老哥,想问下,为什么我在源码里没有看到“...

    搜position

  9. author
    2018-12-03
    wenjing

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

  10. author
    2018-11-10
    Abbey
    2018-11-10
    Arjun
    可以加个qq,微信指导下吗?或者你写一套...

    QQ群:187123200,私聊群主

请先登陆注册

已登录,注销 取消