數(shù)據(jù)接口發(fā)現(xiàn)

微信公眾號機器人項目練習(xí),目前功能有:

  • 四六級
  • 快遞
  • 天氣
  • 電影票房
  • 通識課題目

網(wǎng)上的接口大多收費娜庇,免費版本還需要申請甫何,于是去這些網(wǎng)站做了簡單的調(diào)試后,獲得了幾個 url 查詢偽接口颤诀。

使用到的庫:

作用
urllib quote 方法對中文編碼
requests 仿瀏覽器發(fā)起請求
Beautifulsoup 解析表單
json 處理服務(wù)器的 response 數(shù)據(jù)

1、四六級接口

四六級查詢有兩個官方查詢網(wǎng)址对湃,中國教育考試網(wǎng)和中國高等教育學(xué)生信息網(wǎng)(學(xué)信網(wǎng))崖叫,學(xué)信網(wǎng)的驗證方式較為簡單,反應(yīng)較快拍柒,此次調(diào)試選擇學(xué)信網(wǎng)心傀。

調(diào)試過程:

  1. 構(gòu)造 headers 包括 user-agentreferer(缺少 referer 則查詢失敗)
  2. 需要提交的表單有 zkzh(準(zhǔn)考證號)拆讯、xm(姓名)
  3. 返回成功的數(shù)據(jù)采用 Beautifulsoup 解析相關(guān)信息
import urllib
import requests
from bs4 import BeautifulSoup
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 UBrowser/6.1.3397.16 Safari/537.36',
    "Referer": "http://www.chsi.com.cn/cet/",
}
def get_grade(name, number):
    try:                 # 姓名和學(xué)號可以互換
        int(number)
    except Exception as e:
        # print(e)
        name,number = number,name
    name = urllib.quote(name)
    # 構(gòu)造url相關(guān)信息脂男,用get發(fā)起請求
    response = requests.get(
        "http://www.chsi.com.cn/cet/query?zkzh={}&xm={}".format(number, name),
        headers=headers, allow_redirects=False)
    # 對返回的頁面進行解析
    soup = BeautifulSoup(response.text, "html.parser")
    infos = soup.select("table.cetTable td")
    message = u""
    message += u"姓名:" + infos[0].get_text().strip() + "\n"
    message += u"學(xué)校:" + infos[1].get_text().strip() + "\n"
    message += u"考試級別:" + infos[2].get_text().strip() + "\n"
    message += u"準(zhǔn)考證號:" + infos[3].get_text().strip() + "\n"
    message += u"筆試成績" + "\n"
    message += u"總分:" + infos[4].get_text().strip() + "\n"
    message += u"聽力:" + infos[6].get_text().strip() + "\n"
    message += u"閱讀:" + infos[8].get_text().strip() + "\n"
    message += u"寫作和翻譯:" + infos[10].get_text().strip() + "\n"
    message += u"口試成績" + "\n"
    message += u"準(zhǔn)考證號:" + infos[11].get_text().strip() + "\n"
    message += u"等級:" + infos[12].get_text().strip() + "\n"
    print(message)
    return message
get_grade("準(zhǔn)考證號","姓名")

返回信息:

姓名:李四
學(xué)校:XX大學(xué)
考試級別:英語六級
準(zhǔn)考證號:111111112222222
筆試成績
總分:499
聽力:222
閱讀:150
寫作和翻譯:127
口試成績
準(zhǔn)考證號:--
等級:--

2养叛、快遞查詢

接口來源,快遞 100 宰翅。

調(diào)試過程:

  1. 通過快遞單號獲取到快遞公司名稱弃甥,返回 json 格式的數(shù)據(jù)
  2. 用 json 庫解析數(shù)據(jù),篩選公司名稱
  3. 再將快遞單號公司名稱用 get 方法獲得快遞信息
import requests
import json
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 UBrowser/6.1.3397.16 Safari/537.36',
}
def get_company(number): # 根據(jù)單號獲取快遞公司名稱
    response = requests.get("http://www.kuaidi100.com/autonumber/autoComNum?resultv2=1&text={}".format(str(number)),
                            headers=headers, )
    result = json.loads(response.text)
    company_result = result["auto"][0]["comCode"]
    return company_result, number


def get_state(number):  # 查詢快遞狀態(tài)
    args = get_company(number)
    response = requests.get("http://www.kuaidi100.com/query?type={}&postid={}".format(args[0], args[1]),
                            headers=headers)
    result = json.loads(response.text)
    print(result)
    message = ""
    for info in result["data"]:
        message += info.get("ftime", "") + info.get("context", "") + "\n"
    print(message)
    return message
  
get_state("71182629191986")

返回信息:

·······
2017-10-14 21:00:56寧波市|發(fā)件|寧波市【寧波轉(zhuǎn)運中心】汁讼,正發(fā)往【金華轉(zhuǎn)運中心】
2017-10-14 20:00:12寧波市|到件|到寧波市【寧波轉(zhuǎn)運中心】
2017-10-14 13:43:55寧波市|收件|寧波市【寧波北侖】淆攻,【菜鳥上善/86103085】已攬收

3、電影票房查詢

各大門戶都有相關(guān)的電影票房信息嘿架,在這選擇調(diào)試中國票房 瓶珊。

調(diào)試過程:

  1. 將當(dāng)前時間發(fā)送至相關(guān) url ,返回 json 格式數(shù)據(jù)
  2. 解析 json 數(shù)據(jù)即可
import requests
import json
import time

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 UBrowser/6.1.3397.16 Safari/537.36',
}


def get_movie():
    now_time = str(int(time.time()*1000))
    response = requests.get("http://www.cbooo.cn/BoxOffice/GetHourBoxOffice?d={}".format(now_time), headers=headers)
    data = json.loads(response.text)
    sum_box = u"今日總票房:" + data["data1"][0].get("sumBoxOffice", "") + u"萬 " + u" (每五分鐘更新)\n"
    form = ""
    for movie_detail in data["data2"][0:10]:
        form += movie_detail["Irank"] + u"耸彪、" + movie_detail["MovieName"] + " "
        form += u"實時票房:" + movie_detail["BoxOffice"] + u"萬 "
        form += u"票房占比:" + movie_detail["boxPer"] + u"% "
        form += u"上映天數(shù):" + movie_detail["movieDay"] + u"天 "
        form += u"累計票房:" + movie_detail["BoxOffice"] + u"萬 "
        form += u"實時票房:" + movie_detail["sumBoxOffice"] + u"萬\n"
    print(sum_box + form)
    return sum_box + form


get_movie()

前 10 位票房信息:

今日總票房:1181.8萬  (每五分鐘更新)
1伞芹、王牌特工2:黃金圈 實時票房:340.92萬 票房占比:28.85% 上映天數(shù):7天 累計票房:340.92萬 實時票房:34148.57萬
2、常在你左右 實時票房:235.56萬 票房占比:19.93% 上映天數(shù):0天 累計票房:235.56萬 實時票房:252.06萬
3蝉娜、羞羞的鐵拳 實時票房:142.22萬 票房占比:12.03% 上映天數(shù):27天 累計票房:142.22萬 實時票房:207534.35萬
····

4丑瞧、天氣查詢

來源:心知天氣 api,官網(wǎng)注冊后可獲得一些免費天氣調(diào)用次數(shù)蜀肘。

調(diào)試過程:

  1. 不同的天氣信息有不同的 api
  2. 官方有相關(guān) demo
import requests
import json
from pypinyin import lazy_pinyin

KEY = 'your api'  # API key
UID = "your id"  # 用戶ID
Daily_API = 'https://api.seniverse.com/v3/weather/daily.json'  # API URL,可替換為其他 URL
UNIT = 'c'  # 單位
LANGUAGE = 'zh-Hans'  # 查詢結(jié)果的返回語言

def fetchWeather(location):
    daily_result = requests.get(Daily_API, params={
        'key': KEY,
        'location': location,
        'language': LANGUAGE,
        'unit': UNIT
    })
    return daily_result.text


def get_Weather(city):
    message = ""
    all_result = fetchWeather(city)
    suggestion = json.loads(all_result[0])
    daily = json.loads(all_result[1])
    message += u"地點:" + daily["results"][0]["location"]["name"] + "\n"
    message += u"日期:" + daily["results"][0]["daily"][0]["date"] + "\n"
    message += u"白天天氣:" + daily["results"][0]["daily"][0]["text_day"] + "\n"
    # ····
    print(message)
    return message

get_Weather("shanghai") # 上海的拼音稽屏,相關(guān)拼音轉(zhuǎn)換可搜索相關(guān)庫

返回信息:

地點:上海
日期:2017-10-26
白天天氣:陰
···

5扮宠、通識課查詢

來源于考試資料網(wǎng)

調(diào)試過程:

  1. 該網(wǎng)站對將要查詢題目用 js 進行加密
  2. 查詢成功后狐榔,答案也進行了相關(guān)加密
  3. 分兩次訪問坛增,第一次請求服務(wù)器獲得題目url,第二次請求題目url獲取答案
  4. 查詢一道題目需要訪問兩次該網(wǎng)站薄腻,有點耗時
import re
import requests
import urllib
from bs4 import BeautifulSoup
import json
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 UBrowser/6.1.3397.16 Safari/537.36',
}
def utf8_decode(utf_text):  # 對題目進行加密收捣,查看js代碼寫出python版 
    string1 = ""
    i1 = 0
    while i1 < len(utf_text):
        c = ord(utf_text[i1])
        if c < 128:
            string1 += chr(c)
            i1 = i1 + 1
        elif 191 < c < 224:
            c2 = ord(utf_text[i1 + 1])
            string1 += chr(((c & 31) << 6) | (c2 & 63))
            i1 = i1 + 2
        else:
            c2 = ord(utf_text[i1 + 1])
            c3 = ord(utf_text[i1 + 2])
            string1 += chr(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63))
            i1 = i1 + 3
    # print(string1)
    return string1


def decode_result(encoded_text): # 對返回的答案進行解密,查看js代碼寫出python版
    text = encoded_text
    _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
    i = 0
    output1 = ""
    input1 = re.sub(r'[^A-Za-z0-9+/=]', "", text, re.S)
    while i < len(input1):
        enc1 = _keyStr.index(input1[i])
        i = i + 1
        enc2 = _keyStr.index(input1[i])
        i = i + 1
        enc3 = _keyStr.index(input1[i])
        i = i + 1
        enc4 = _keyStr.index(input1[i])
        i = i + 1
        chr1 = (enc1 << 2) | (enc2 >> 4)
        chr2 = ((enc2 & 15) << 4) | (enc3 >> 2)
        chr3 = ((enc3 & 3) << 6) | enc4
        output1 = output1 + chr(chr1)
        if enc3 != 64:
            output1 = output1 + chr(chr2)
        if enc4 != 64:
            output1 = output1 + chr(chr3)

    output1 = utf8_decode(output1)
    if "tiku/shiti" in output1:
        number = re.match(r".*?(\d+).*", output1)
        return number.group(1)
    else:
        raise Exception("無法查詢此題目")
        
def get_question(question):  # 題目編碼后向服務(wù)器獲取題目答案地址庵楷,地址在返回的 json 中
    trans = urllib.parse.quote(question.encode("gb2312"))
    url = "https://data.api.ppkao.com/Interface/UserQueryApi.ashx?action=GetUserQueryWord&word={}&page=1".format(trans)
    response = requests.get(url, headers=headers)
    text = json.loads(response.text[13:-1])
    link_code = text["UserQueryList"][0].get("urlPC", "")
    if link_code is "":
        link_code = text["UserQueryList"][0].get("urlApp", "")
    return link_code
  
def get_answer(id):  # 最后解析題目答案
    url = "http://user.ppkao.com/mnkc/tiku/?id={}".format(id)
    response = requests.get(url, headers)
    soup = BeautifulSoup(response.text, "lxml")
    obj = re.search(r".*查看答案罢艾!(.*)進入題庫.*", soup.text, re.S)
    # print(obj.group(1).strip())
    bb = ""
    for aw in obj.group(1).strip().split("\n"):
        if aw:
            bb += aw + "\n"
    print(bb)
    # print(obj.group(1).strip())
    return bb

def final_get_answer(question):
    abc = get_question(question)
    defg = decode_result(abc)
    return get_answer(defg)

final_get_answer("冥王星與其他大行星迥異的特點不包括")

返回答案:

單項選擇題
冥王星與其他大行星迥異的特點不包括()。

    A尽纽、公轉(zhuǎn)軌道平面偏角較大?
    B咐蚯、未清空軌道附近其他天體?
    C、體積比一些衛(wèi)星還小?
    D弄贿、太陽位于其軌道的一個焦點上
參考答案:D

寫在后面

在這五個功能中春锋,較難的是通識課的調(diào)試,需要涉及到 js 代碼差凹、加解密等 期奔,其他幾個調(diào)試較為容易侧馅,將 json 數(shù)據(jù)轉(zhuǎn)成 python 的字典、用 requests 構(gòu)造請求呐萌。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末馁痴,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子搁胆,更是在濱河造成了極大的恐慌弥搞,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件渠旁,死亡現(xiàn)場離奇詭異攀例,居然都是意外死亡,警方通過查閱死者的電腦和手機顾腊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門粤铭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人杂靶,你說我怎么就攤上這事梆惯。” “怎么了吗垮?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵垛吗,是天一觀的道長。 經(jīng)常有香客問我烁登,道長怯屉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任饵沧,我火速辦了婚禮锨络,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘狼牺。我一直安慰自己羡儿,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布是钥。 她就那樣靜靜地躺著掠归,像睡著了一般。 火紅的嫁衣襯著肌膚如雪悄泥。 梳的紋絲不亂的頭發(fā)上拂到,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機與錄音码泞,去河邊找鬼兄旬。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的领铐。 我是一名探鬼主播悯森,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼绪撵!你這毒婦竟也來了瓢姻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤音诈,失蹤者是張志新(化名)和其女友劉穎幻碱,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體细溅,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡褥傍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了喇聊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恍风。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖誓篱,靈堂內(nèi)的尸體忽然破棺而出朋贬,到底是詐尸還是另有隱情,我是刑警寧澤窜骄,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布锦募,位于F島的核電站,受9級特大地震影響邻遏,放射性物質(zhì)發(fā)生泄漏糠亩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一党远、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧富弦,春花似錦沟娱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至盏缤,卻和暖如春砰蠢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背唉铜。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工台舱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓竞惋,卻偏偏與公主長得像柜去,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子拆宛,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理嗓奢,服務(wù)發(fā)現(xiàn),斷路器浑厚,智...
    卡卡羅2017閱讀 134,626評論 18 139
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫股耽、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,058評論 4 62
  • 下一篇 Framework--怎么使用Framework 1钳幅、什么是Framework物蝙? Framework是資...
    慧惠閱讀 3,016評論 0 5
  • 最近趕項目,一周上7天班每天還得搞到十點十一點贡这,實在是沒有精力再看書了茬末。但是寫項目的時候碰到的一個Bug完全超出了...
    CoderMageFox閱讀 2,595評論 1 3
  • service崩霾眩活 在實際開發(fā)中,我們會遇到一些要求后臺運行的service辈双,但是現(xiàn)在Android手機型號太多责掏,...
    北方的天空2000閱讀 1,789評論 0 5