Python 登录移动查询话费

通过python爬虫方式登录10086后台,查询话费。# -*- coding: utf-8 -*-

# @Time : 2019-02-22 09:52

# @Author : cxa

# @File : beijing_crawler.py

# @Software: PyCharm

import requests

import time

import base64

from Cryptodome.Cipher import PKCS1_v1_5

from Cryptodome.PublicKey import RSA

from io import BytesIO

import random

from PIL import Image

import re

class BeiJingCrawler():

headers = {

"Accept": "application/json, text/javascript, */*; q=0.01",

"Accept-Encoding": "gzip, deflate, br",

"Accept-Language": "zh-CN,zh;q=0.9",

"Connection": "keep-alive",

"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",

"Host": "login.10086.cn",

"Origin": "https://login.10086.cn",

"Referer": "https://login.10086.cn/html/bj/iloginnew.html?1551250969321",

"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36",

"X-Requested-With": "XMLHttpRequest",

}

def __init__(self, phone):

self.session = requests.Session()

self.phone_number = phone

def get_timestamp(self):

return int(time.time() * 1000)

def check_uid_available(self):

url = "https://login.10086.cn/checkUidAvailable.action"

req = self.session.get(url, headers=self.headers)

return req

def chk_number_action(self):

'''

检查是否为北京移动,是返回true,不是返回flase

:return:

'''

url = "https://login.10086.cn/chkNumberBjAction.action"

data = {

"userName": self.phone_number

}

req = self.session.post(url, headers=self.headers, data=data)

return req

def loadToken(self):

url = "https://login.10086.cn/loadToken.action"

data = {

"userName": self.phone_number

}

req = self.session.post(url, headers=self.headers, data=data)

return req

def sendRandomCodeAction(self, result):

self.headers["Xa-before"] = result

url = "https://login.10086.cn/sendRandomCodeAction.action"

data = {

"userName": self.phone_number,

"type": "POST",

"channelID": "00100"

}

req = self.session.post(url, headers=self.headers, data=data)

return req

def sendflag(self, ):

t = self.get_timestamp()

url = "https://login.10086.cn/sendflag.htm"

data = {

"timestamp": t

}

req = self.session.get(url, headers=self.headers, params=data)

return req

def send_sms_code(self):

r = self.check_uid_available()

code = r.json().get("code")

if code == "1":

r1 = self.chk_number_action()

flag = r1.text

if flag:

r2 = self.loadToken()

token = r2.json().get("result")

print("token", token)

r4 = self.sendflag()

print("r4", r4.text)

r3 = self.sendRandomCodeAction(token)

if r3.text == "0":

print("验证码发送成功!")

elif r3.text == "1":

print("验证码发送频繁,请一分钟后再重试!")

elif r3.text == "2":

print("验证码发送频繁,已经超过最大次数")

def get_password(self, k):

rsa_publickey = '''-----BEGIN PUBLIC KEY-----

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsgDq4OqxuEisnk2F0EJF

mw4xKa5IrcqEYHvqxPs2CHEg2kolhfWA2SjNuGAHxyDDE5MLtOvzuXjBx/5YJtc9

zj2xR/0moesS+Vi/xtG1tkVaTCba+TV+Y5C61iyr3FGqr+KOD4/XECu0Xky1W9Zm

maFADmZi7+6gO9wjgVpU9aLcBcw/loHOeJrCqjp7pA98hRJRY+MML8MK15mnC4eb

ooOva+mJlstW6t/1lghR8WNV8cocxgcHHuXBxgns2MlACQbSdJ8c6Z3RQeRZBzyj

fey6JCCfbEKouVrWIUuPphBL3OANfgp0B+QG31bapvePTfXU48TYK0M5kE+8Lgbb

WQIDAQAB

-----END PUBLIC KEY-----'''

key = RSA.import_key(rsa_publickey)

passwd = PKCS1_v1_5.new(key)

text = base64.b64encode(passwd.encrypt(bytes(k, encoding='utf-8')))

return str(text, encoding='utf-8')

def login(self, code=None):

num = self.phone_number

if not code:

self.sms_code = input("请输入短信验证码:\n")

self.sms_ser = input("请输入服务密码")

else:

self.sms_code = code

login_url = "https://login.10086.cn/touchBjLogin.action"

data = {

"account": num,

"accountType": "01",

"channelID": "00100",

"password": self.get_password(self.sms_code),

"protocol": "https:",

"pwdType": "02",

"rememberMe": "0",

"timestamp": self.get_timestamp(),

}

req = self.session.post(login_url, headers=self.headers, data=data)

return req

def verify_captcha(self, code):

'''验证验证码是否正确'''

flag = self.checkzh(code)

if flag == 1:

'''1表示中文三个字的验证码'''

code = self.str_to_hex(code)

req = self.session.get(f"https://login.10086.cn/verifyCaptcha?inputCode={code}")

resultCode = req.get("resultCode")

return resultCode

def str_to_hex(self, s):

return ''.join([hex(ord(c)).replace('0x', '') for c in s])

def checkzh(self, s):

"""判断验证码是否为中文"""

pat = re.compile("^[\u4E00-\u9FA5]{3}$")

res = pat.findall(s)

return len(res)

def get_verify_code_img(self):

url = "https://login.10086.cn/captchazh.htm?type=12"

buff = self.session.get(url).content

image = Image.open(BytesIO(buff))

image.show()

def get_authimg(self):

url = f"https://shop.10086.cn/i/authImg?t={random.random()}"

buff = self.session.get(url).content

image = Image.open(BytesIO(buff))

image.show()

def bill(self, res):

r_json = res.json()

print("登录状态", r_json)

code = r_json.get("result")

desc = r_json.get("desc")

while code != "0":

code = input("请输入正确的短信验证码:")

print("开始发送图片验证码")

self.get_verify_code_img()

img_code = input("获取图片验证码,请输入图片验证码")

rescode = self.verify_captcha(img_code)

while rescode != "0":

img_code = input("图片验证码错误,请输入图片验证码:")

rescode = self.verify_captcha(img_code)

print("图片验证码输入正确")

res = self.login(code)

code = res.get("result")

print("短信验证码输入正确")

r_json = res.json()

print(r_json)

assert_acceptURL = r_json.get("assertAcceptURL")

artifact = r_json.get("artifact")

init_url = "https://service.bj.10086.cn/poffice/package/ywcx.action?PACKAGECODE=CXNEW"

data = {

"artifact": artifact,

"backUrl": init_url

}

print("artifactUrl", assert_acceptURL)

headers = self.headers

headers.update({'Host': 'service.bj.10086.cn'})

req = self.session.get(assert_acceptURL, headers=self.headers, params=data, verify=False,

allow_redirects=False)

req.encoding = req.apparent_encoding

redirect_url = req.headers['Location']

headers.update({'Referer': ''})

redirect_res1 = self.session.get(url=redirect_url, headers=headers)

redirect_res1.encoding = 'utf-8'

bill_detail_url = "https://service.bj.10086.cn/poffice/package/xdcx/xdcxShow.action?PACKAGECODE=XD"

headers.update({'Referer': 'http://service.bj.10086.cn/poffice/jsp/service/fee/fee.jsp'})

bill_req = self.session.get(bill_detail_url, headers=headers, verify=False)

print(bill_req.text)

yzmcheck_url = "https://service.bj.10086.cn/poffice/package/xdcx/userYzmCheck.action"

data = {

"yzCheckCode": self.sms_ser,

"PACKAGECODE": "XD",

}

yzmcheck_req = self.session.post(yzmcheck_url, headers=headers, data=data)

yzmcheck_json = yzmcheck_req.json()

message = yzmcheck_json.get("message")

if message.upper() == "Y":

for item in ("201901", "201812"):

data = {

"PACKAGECODE": "XD",

"xdFlag": "GSM",

"month": item,

}

headers.update(

{'Referer': 'https://service.bj.10086.cn/poffice/package/xdcx/xdcxShow.action?PACKAGECODE=XD'})

xdsxshow_url = "https://service.bj.10086.cn/poffice/package/xdcx/xdcxShow.action"

xdsxshow_req = self.session.post(xdsxshow_url, headers=headers, data=data)

print(f"{item}通话详单", xdsxshow_req.text)

else:

print("登录失败", message)

def base64encode(self, passwd):

text = base64.b64encode(bytes(passwd, encoding='utf-8')).decode("utf-8")

return text

if __name__ == '__main__':

num = "xxxxxxx"

bj = BeiJingCrawler(num)

bj.send_sms_code() # 发送短信验证码

res = bj.login()

bj.bill(res)

文章出处:北京移动

python话费充值_Python 登录移动查询话费相关推荐

  1. python记事本_python记事本实现查询替换

    # encoding=utf-8 from tkinter import * from tkinter.filedialog import * from tkinter.messagebox impo ...

  2. python话费充值_用Python方法查询移动手机余额话费的源码示例

    Python语言的应用范围很广泛,今天看到有人用python写的代码,完成了查询手机(移动)话费的功能,感觉很强大.特别搬过来给伙伴们欣赏欣赏. 这里需要说明的是,代码试用是需要使用手机号码和服务密码 ...

  3. python批量查询数据库_Python + MySQL 批量查询百度收录

    做SEO的同学,经常会遇到几百或几千个站点,然后对于收录情况去做分析的情况 那么多余常用的一些工具在面对几千个站点需要去做收录分析的时候,那么就显得不是很合适. 在此特意分享给大家一个批量查询百度收录 ...

  4. python爬取物流信息_python爬虫快递查询系统(源码)

    import requests import json def get_express_type(postid): '''根据快递单号来智能判断快递类型''' url = 'http://www.ku ...

  5. python mysql批量查询_Python + MySQL 批量查询百度收录

    做SEO的同学,经常会遇到几百或几千个站点,然后对于收录情况去做分析的情况 那么多余常用的一些工具在面对几千个站点需要去做收录分析的时候,那么就显得不是很合适. 在此特意分享给大家一个批量查询百度收录 ...

  6. python做一个登录注册界面_python做一个登录注册界面的方法

    python做一个登录注册界面的方法 发布时间:2020-08-21 10:37:05 来源:亿速云 阅读:111 作者:小新 这篇文章主要介绍python做一个登录注册界面的方法,文中介绍的非常详细 ...

  7. python基础之模拟ATM 注册 、登录 、查询余额 、存款 、取款 、转账 、退卡(原代码)

    curruent_users = None users = [{'username': 'lili', 'password': '123456', 'banlance': 30000},{'usern ...

  8. python字典模糊查找_python字典模糊查询-女性时尚流行美容健康娱乐mv-ida网

    女性时尚流行美容健康娱乐mv-ida网 mvida时尚娱乐网 首页 美容 护肤 化妆技巧 发型 服饰 健康 情感 美体 美食 娱乐 明星八卦 首页  > 高级搜索 access中的 模糊 查询 ...

  9. python话费充值_【图片】话费充值解决方案(附代码)转载【开发吧】_百度贴吧...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 话费充值服务 继上次介绍的流量充值.我们还需要做话费充值,还是在APIX平台找的话费充值服务,http://www.apix.cn/services/sh ...

最新文章

  1. Lucene排序以及自定义排序
  2. linux date命令显示毫秒,解决MacOS系统中date命令没有毫秒和sha512sum、sha256sum、md5sum等命令的问题...
  3. Qt 安装与配置记录
  4. 计算机考研在线题库,考研全题库电脑版
  5. php的前端环境,PHP中的环境变量
  6. Visual Studio2013配置安装Opencv2.4.9详细过程
  7. synchronized()_synchronized 和 ReentrantLock 有什么区别?
  8. 【元胞自动机】基于matlab元胞自动机模拟SEIR传播模型【含Matlab源码 2156期】
  9. 300万高清车牌识别一体机Http推送
  10. 计算机系统的基本组成
  11. python get rect 函数_Pygame:如何正确使用get_rect()
  12. window10c语言下载,[下载备用]Windows 10多国语言包和独立语言包下载
  13. linux添加变色龙引导,u盘启动盘制作win7变色龙引导工具
  14. 桌面支持--skype登陆不上
  15. 有效载荷偶联ADC抗体偶联物的特征及应用探讨-瑞禧
  16. DFS与BFS的区别、用法、详解?
  17. Cron表达式与CronTrigger
  18. 饱和非线性、非饱和非线性
  19. 医院his系统 源代码_中药煎配中心运营指南⑤ | 中药煎配中心如何接收医院处方...
  20. java se  通用能力-数量关系专项练习(选择题)

热门文章

  1. “大姨吗”创始人柴可:“慢就是快”
  2. python生成日期列表_PYTHON生成日期维度表
  3. AUC值越大_AUC,ROC 讲解
  4. htcm8 android8,HTC全面屏手机 U11 Plus曝光:6寸+骁龙835,安卓8.0系统
  5. 书籍笔记-《SQL必会知识》
  6. [Alpha阶段]第十次Scrum Meeting
  7. 如何使用 Docker Buildx Bake 创建复杂的镜像构建管道
  8. Python之assert断言语句
  9. im2col函数实现超级详细解释
  10. 2188 完成比赛的最少时间(递推)