【作者: 0han 未经授权请勿转载】
Python批量注册instagram账户,利用了ins在用户注册时不验证邮箱的漏洞,现已成功实现自动注册,同时遇到的问题是ip代理的不可用,导致注册超过10个以后被ins要求添加手机号,此文更改于2016年的项目,2017年8月重新按照面对对象编程重写了脚本,源代码见文底github,遇到的问题见下,有解决办法的朋友请评论区告知,感激不尽。
环境:Python3.x
依赖的第三方库: requests, BeautifulSoup
依赖的库: import requests,re,json,time,os,os.path,sys
遇到的问题:
- requests.get(url,proxies=ip)#使用代理时,发现requests的代理并无用处,由于获取代理的轮子是自己写的,专门做了验证,确实无法实现代理,这也导致了ins封锁我的ip注册数
- 我还写了一个下载头像用的库(下面有详解),但是在提交头像到ins时没有成功,不太清楚怎么处理。
00x01 ins注册流程
Instagram的注册页:
很显然提交四个数据,email, username, password, full name. 其中email, username不能和别的用户重复,first name作为显示的nickname,full name可以随便写,full name的来源,我目前是建立了一个包含13个英文常用名的数组,username会从一个叫做username generator的网站上,根据full name获取,比如说full name叫做William, username generator 会根据你提交的这个名字William 返回70个(也可以设置成别的)它自动生成的username, 为了保险起见我在它返回给我的名字后面再加上"user"以及str(randint(1,2000))#随机获取1到2000内任意数字并转换为字符串,有点像密码学中的加盐,这样可以规避被重复的可能。password即为full name + “password”。 邮箱很有讲头,即使ins不会发送认证邮件,但我还是选择从这个网站-10minutemail上获取每十分钟就会销毁的邮件地址。在register() class 中,这四个data的获取都在分别的函数里,最后一个创建提交数据的函数:
def create_ajax(self):
self.email=self.get_emailaddress()
self.f_name=self.generate_FullName()
self.passwd=self.f_name+'password'
self.u_name=self.create_username()
r_data={ 'email': self.email, #注册邮箱 'password': self.passwd,#密码 'username':self.u_name,#账号(不能重复) 'first_name': self.f_name#全名 }
return r_data
注册ins的主要流程是:创建提交数据-建立session-get ins-保存cookie-提交cookie-获取response-删除cookie
创建cookie和删除cookie的函数可见文末github中ins.py文件
在post数据到ins的时候,有一个很tricky的地方,在header中有一个"X-csrftoken"值,这个值的获取要从你刚刚保存的cookie里获取,只需要在save-cookie的函数最后加一条return cookie["csrftoken"]
并赋值到self.csrf
,在post的header中添加数据""X-csrftoken":self.csrf" 提交数据到指定的refer,会得到response200的提示,可以使用requests库提供的方法判断是否成功:
if r.ok==True:
print("[*] Sucessful create an account")
成功注册后可以成功登陆:
这张图是一年前的截图,最近搞的懒得截了,几乎是一样的:
00x02 装备头像
多试几次就会发现,刚注册的账号如果没有上传头像,很容易被认定为机器人并在unknown的时间段被删掉,我所用的是pixabay.com提供的api,只需要注册一个账户,获取一个免费的key,设置url="https://pixabay.com/api/?key="+self.key+"&q="+"people""
people可以改为别的,所以我repo目录里的get_pic文件不仅是为了获取头像,同时可以获取机器账号自动发文的图片,所以在get_pic()
这个class里,get_selfie()方法配合download_pic()方法可以获得随机的,和people元素有关的图片,保存到当前目录"selfie/1.jpg"里,供给主脚本ins.py使用,但是我在上传图片的函数里出现了问题,file={"file":open("selfie/1.jpg","rb")}
后再 r=requests.post(post_selfie_url,headers=header,proxies=self.use_proxy,data=data,files=file,verify=True)
返回的response永远是403,希望有经验的朋友交流。
00x03 装备ip
ip的使用我以前写过别的爬虫爬取代理ip网页的例子,但现在发现自己当年太sb,这次找了一个提供api的免费网站,gimmeproxy,只需要构建这个url:https://gimmeproxy.com/api/getProxy?get=true&anonymityLevel=0&country=US
用get就可以获得一个json,包含了所需要的信息。为了测试是否可用,我在proxy.py文件里除了获取代理IP用的get_proxy()函数,又写了一个test()函数,也是通过一个免费api检测本地ip的网站:url='https://api.ipify.org?format=json'
通过res=s.get(url,proxies=ip,verify=True)#ip是刚刚用get_ip()获取的ip
返回的结果显示代理ip和返回的本地ip不一样,说明代理ip并没有起到效果,希望有经验的朋友告知一下
Summary
总体而言,ins机器人账户的本意是为了follow,点赞你的主号,但目前仍未突破ip限制,点赞和follow的function还未开始写
- 源代码链接: 0han's GitHub repo
- 邮箱: 0han@protonmail.com
文笔不好 评论区讨论🙏