我如何通过Vkontakte文档规避对Messages API的禁止

您好整个Habro社区。对我来说,第一篇文章是在一定程度的愉悦感下撰写的,因此请不要对文学方面的文章进行过于严格的判断。但是,话少了,开始做生意。

一切如何开始


我们都知道VC具有API,而且我敢肯定,大多数人都会尝试将其用于自己的目的。就个人而言,我有很多与之相关的项目:5个强大的bot片段,从群组帖子中编译大规模数据集等。而且,我的朋友几次要求我从对话的附件,照片中下载歌曲或将与某人的通信文本保存在单独的文件中也就不足为奇了。

但是一旦“它”出现,从那一刻起,执行这样的小请求就不再是一件微不足道的任务:

图片

因此,几天前,为了彻底解决此问题,我决定通过http请求编写包装器,假装是普通用户,因此具有与消息部分官方API相同的强大工具。

让我们转到工作上


因此,我从授权开始。有了https嗅探器和Firefox,我就可以完成授权的所有“步骤”并获得最终的cookie。从现在开始,只剩下了解如何进行查询。发现大多数数据是通过https://vk.com/wkview.php的POST请求接收的,只是每次不同情况下的参数都会更改。我设法编写了用于抽出绝对所有类型投资的函数,但是我们不会对此进行详细介绍,因为一时一切都发生了巨大变化。
链接到用于接收授权cookie的文件(我写它仅用于两步验证,因为它花费了大多数人的精力)

意外发现


当一个朋友走过来问我在做什么时,我正在笔记本电脑上工作。由于无法用手指快速向他解释整个问题,因此我打开了“消息”部分的官方文档,当我看到这些“禁止”方法的主要内容时,感到震惊:

图片

不,您正确地理解我,我不是第一个只是看到这个机会。我将其与其他方法一起使用了很多次,但我什至无法想到“示例请求”功能将保留在消息部分的方法中。当我把交通挤得满满的时候,我感到更加惊讶。这些只是普通的API请求,仅在网站上,这些请求在Web表单中仅稍有不同,并且具有某种哈希ID。

图片

几分钟后,我意识到hash-ID只是位于button标记的data-hash属性中的一个字符串,几分钟后,我已经在努力实现对“测试请求”的仿真,并且并不完全相信它会起作用。毕竟,请确保这些请求在数量上有某种限制,或者类似的限制。但是令我惊讶的是,这个写在我膝盖上的30行脚本(不计算接收cookie的次数)能够在4分钟内从对话附件中抽出1.5万张图片。

图片

我应用所使用的代码
import requests, pickle, re, json

with open('cookies_vk_auth.pickle', 'rb') as handle:
    cookies_final = pickle.load(handle)

session = requests.Session()
peer_id = int(input('  :  '))

response = session.get(f'https://vk.com/dev/messages.getHistoryAttachments', cookies=cookies_final)
hash_data =  re.findall(r'data-hash="(\S*)"', response.text)[0]

session = requests.Session()
response = session.post(f'https://vk.com/dev',
            data=f'act=a_run_method&al=1&hash={hash_data}&method=messages.getHistoryAttachments&param_count=20&param_max_forwards_level=45&param_media_type=photo&param_peer_id={peer_id}&param_photo_sizes=0&param_preserve_order=0&param_v=5.103', cookies=cookies_final)

count=20

for i in range(200):
    response_json = json.loads(json.loads(response.text[4:])['payload'][1][0])['response']['items']

    for photo in response_json:
        ph = photo['attachment']['photo']['sizes'][-1]['url']
        r = session.get(ph, timeout=10)
        
        if r.status_code == 200:
            with open(f'D://dev/'+str(ph.split('/')[-1]), 'wb') as f:
                f.write(r.content)

    m_id = photo['message_id']
    response = session.post(f'https://vk.com/dev',
            data=f'act=a_run_method&al=1&hash={hash_data}&method=messages.getHistoryAttachments&param_count=20&param_start_from={m_id}&param_max_forwards_level=45&param_media_type=photo&param_peer_id={peer_id}&param_photo_sizes=0&param_preserve_order=0&param_v=5.103', cookies=cookies_final)


令我印象深刻的是,此时我决定降温并尝试实现其他方法(突然间我只是被误认为了)。我使用了History方法,结果是相似的。只有我必须设置0.1秒的延迟,以便服务器不会给出太多请求的错误。(如果有人重复,请记住,在更改方法时,您还需要将URL更改为哈希数据来自的文档)。也就是说,这种方法确实使通过官方文档访问消息部分成为可能,仅使用密码和用户登录即可。为了提高可靠性,我尝试对另一个帐户执行相同的步骤并获得了相同的结果。

总结一下


因此,我认为,每个人都已经意识到这是对我们个人数据保护的一种违规行为,这种行为已经在文档中搁置了一年,并且不知道有多少人使用过它。而且,这个差距很大,需要尽快消​​除。为了再次证明这不是这种方式,我将引用VK开发人员自己:
如果计划开始开发Messenger,则需要在2019年2月15日之后获得支持的测试访问权限,这意味着使用独立应用程序管理员的密钥来工作“消息”部分中的方法。

也就是说,即使要获得将有权访问用户通信的内部应用程序的令牌,也需要获得VK的个人许可,更不用说使用常规密码和登录名进行访问了。

我个人的意见


禁止消息部分并未对用户的安全性带来任何根本性的改变。他只是指定了边界,并切断了一群“黑客”,他们甚至不了解他们在做什么,就可以完全访问数据。对于在编程方面更有经验的其他人来说,获得通信联系只是时间问题。在本文的第一部分中,我以自己的示例证明了这一点,即创建了一个用于抽出附件的程序,可以假装成用户的库的出现并不遥不可及。也许我本人会把它终结,而VK开发人员需要为此做好准备,并且在我们的数据隐私对他们而言真的很重要的情况下,想出办法来识别过于可疑的用户活动。

聚苯乙烯
, ) , .

All Articles