[Cookie实战]一键部署大批量的Cookie调试环境
Cookie池项目介绍
web项目,统一管理账号密码,以及维护Cookie
【定时】全自动根据账号密码登录并提取Cookie
【被动】协助式绕过验证码实现登录并获取Cookie
主动提供接口API,实现Cookie的使用
高可用的预留拓展接口
实践操作:Cookie池项目源码介绍
Cookie #是添加的App应用
- 包含主要的模型(models.py)和主要的任务(tasks.py)
cookiemanage和manage.py是基础的行为文件
celerybeat-schedule.db和cookiemanage-django.sqlite3是数据库文件
cookiemanage
- celery.py 这个文件不要动
- urls.py 拓展链接的时候可以在urlpatterns里面加
- wsgi.py 这个文件也不要动
- settings.py
- cookie
- migrations 这是一个App
- 我们需要做的是模型models,任务tasks,views
- models.py
fromdjango.dbimportmodelsfromdjango.utils.timezoneimportnow#web账号的模型classWebModel(models.Model):# 网站的名称name=models.CharField(default='',max_length=64,verbose_name="网站名称")#登录的网址loginurl=models.CharField(default='',max_length=255,verbose_name="登录网址")#首页的网址indexurl=models.CharField(default='',max_length=255,verbose_name="首页网址")#判断登录是自动化登录还是半自动化的协助登录HALF_OR_AUTO=(('auto','auto'),('half','half'))half_or_auto_get_cookie=models.CharField(choices=HALF_OR_AUTO,default='auto',max_length=32,verbose_name="全自动或半自动获取Cookie")#提取Cookie的脚本extract_cookie_script=models.TextField(default='',verbose_name="提取Cookie的Python脚本",blank=True,null=True)#脚本的选择SCRIPT=(('python','python'),('javascript','javascript'),('default','default'))active_cookie_use_python_or_javascript_script=models.CharField(max_length=64,choices=SCRIPT,default='default',verbose_name="选择使用脚本")active_js_script=models.TextField(default='',verbose_name="活跃Cookie的JS脚本",blank=True,null=True)wait_exec_active_js_script=models.IntegerField(default=100,verbose_name="等待JS执行的时间")active_python_script=models.TextField(default='',verbose_name="活跃Cookie的Python脚本",blank=True,null=True)def__str__(self):returnf"{self.name}网站,目前有{self.accounts.count()}个会员账号"#账号模型classAccountModel(models.Model):#属于哪个网站web=models.ForeignKey(to=WebModel,on_delete=models.CASCADE,related_name="accounts",verbose_name="归属网站")#账号username=models.CharField(default='',max_length=64,verbose_name="账号")#密码password=models.CharField(default='',max_length=64,verbose_name="密码")#获取Cookiecookie=models.TextField(default='',verbose_name="Cookie",blank=True,null=True)opera_datetime=models.DateTimeField(verbose_name="操作时间",auto_now=True)@propertydefactive_cookie_use_python_or_javascript_script(self):returnself.web.active_cookie_use_python_or_javascript_scriptdef__str__(self):#默认输出时的内容returnf"{self.username}账号归属于{self.web.name},当前Cookie:{self.cookie}"defto_dict(self):temp_dict={'web':{'name':self.web.name,'loginurl':self.web.loginurl,'indexurl':self.web.indexurl,},'id':self.id,'username':self.username,'password':self.password,'extract_cookie_script':self.web.extract_cookie_script,}returntemp_dictdefcookie_to_dict(self):temp_dict={'web':{'name':self.web.name,'loginurl':self.web.loginurl,'indexurl':self.web.indexurl,},'id':self.id,'username':self.username,'cookie':self.cookie,'active_cookie_use_python_or_javascript_script':self.web.active_cookie_use_python_or_javascript_script,'active_js_script':self.web.active_js_script,'wait_exec_active_js_script':self.web.wait_exec_active_js_script,'active_python_script':self.web.active_python_script,}returntemp_dict#活动记录的模型,账号记录classActiveRecordModel(models.Model):#创建了哪个账号account=models.ForeignKey(to=AccountModel,on_delete=models.CASCADE,related_name="active_record",verbose_name="归属账号")#账号做了哪些操作opera=models.CharField(default='',verbose_name="操作",max_length=128,null=True,blank=True)#开始时间start_datetime=models.DateTimeField(default=now,verbose_name="开始时间")#结束时间end_datetime=models.DateTimeField(default=now,verbose_name="结束时间")def__str__(self):returnf"{self.account.username}活跃记录,进行了{self.opera}操作,开始于{self.start_datetime}, 结束于{self.end_datetime}"- task任务
fromceleryimportshared_task,taskimportrandom,datetime,json,requestsfromlxmlimportetreefromtimeimportsleepfromdjango.utils.timezoneimportnowfromcookie.modelsimportAccountModel,WebModel,ActiveRecordModelfromdjango.db.modelsimportQ@taskdefcheck_account_need_auto_get_cookie():#检测账号是否需要自动读取Cookieaccounts=AccountModel.objects.filter(cookie='')#检测没有Cookie的账号foracinaccounts:#ac是提取账号的名称ifac.web.half_or_auto_get_cookie=='auto':#看一下他的站是否是自动的,如果是自动的就自动提取如果不是就半自动提取auto_get_cookie(ac)# print(ac)@taskdefauto_get_cookie(account):#自动提取Cookiestart_datetime=now()#开始name=account.web.name#账号的名称ifname=='shanzhi':#最好用英文的名称如果是shanzhi这个网站就到website这里面来了fromwebsite.shanzhi.auto_get_cookieimportmain status,cookie=main(account.username,account.password)ifstatus:#如果状态码为trueaccount.cookie=cookie account.save()#保存一下就可以了else:returnFalse#如果失败返回falseelse:returnFalseend_datetime=now()#结束时间arm=ActiveRecordModel(account=account,opera='自动登录提取Cookie',start_datetime=start_datetime,end_datetime=end_datetime)arm.save()#记录操作returnTrue@taskdefcheck_account_cookie_need_active():accounts=AccountModel.objects.filter(Q(web__active_cookie_use_python_or_javascript_script='default'),~Q(cookie='')).order_by('-opera_datetime')[:2]foracinaccounts:activate_cookie(ac)@taskdefactivate_cookie(account):start_datetime=datetime.datetime.now()# print(account.cookie,'-------------')cookie_dict=json.loads(account.cookie)session=requests.Session()session.cookies=requests.utils.cookiejar_from_dict(cookie_dict)num=1whilenum<=5:response=session.get(account.web.indexurl)html=etree.HTML(response.text)links=html.xpath(".//a/@href")link=random.choice(links)ifnotlink:end_datetime=datetime.datetime.now()arm=ActiveRecordModel(account=account,start_datetime=start_datetime,end_datetime=end_datetime)arm.save()returnFalsesession.get(link)sleep(random.randint(4,20))num+=1cookies_dict=requests.utils.dict_from_cookiejar(session.cookies)cookies_str=json.dumps(cookies_dict)account.cookie=cookies_str account.save()end_datetime=datetime.datetime.now()arm=ActiveRecordModel(account=account,opera='活跃Cookie',start_datetime=start_datetime,end_datetime=end_datetime)arm.save()returnTrue- website 需要注册
- 在settings文件中,找到INSTALLED_APPS进行注册
Cookie池项目介绍
- 涉及技术:Django,Celery,远程协调
- celery 异步,用于定时比较方便
- 部署方式:单机部署+协助拓展