我是如何白嫖 Github 服务器自动抓取每日必应壁纸的?
如何使用 Github 服務(wù)器自動(dòng)抓取必應(yīng)搜索的每日壁紙呢?
如果你訪問過必應(yīng)搜索網(wǎng)站,那么你一定會(huì)被搜索頁面的壁紙吸引,必應(yīng)搜索的壁紙每日不同,自動(dòng)更換,十分精美。這篇文章會(huì)介紹如何一步步分析出必應(yīng)搜索壁紙 API ,如何結(jié)合 Github Actions自動(dòng)抓取每日必應(yīng)壁紙到 Github 倉庫。
元宵節(jié)當(dāng)天具有中國元素的必應(yīng)搜索。
必應(yīng)搜索主頁平常一天的必應(yīng)搜索。
必應(yīng)首頁?
分析必應(yīng)壁紙 API
既然是網(wǎng)站上的背景,又是每天更換,很大概率是通過某個(gè) API 請(qǐng)求返回壁紙信息的,事實(shí)真是如此嗎?直接打開瀏覽器 network 控制臺(tái)監(jiān)控網(wǎng)絡(luò)請(qǐng)求信息。
分析必應(yīng)壁紙API篩選 XHR 異步請(qǐng)求,排除 js 文件加載請(qǐng)求后,在一個(gè)路徑為 HPImageArchive.aspx ?的請(qǐng)求中,發(fā)現(xiàn)響應(yīng)的信息似乎和背景圖片有關(guān),直接復(fù)制出請(qǐng)求的 URL ,得到了一個(gè)似乎是壁紙 API 的接口。
https://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&nc=1614319565639&pid=hp&FORM=BEHPTB&uhd=1&uhdwidth=3840&uhdheight=2160這個(gè)接口返回的信息到底是不是頁面上的圖片信息呢?還需要進(jìn)一步測試,單獨(dú)請(qǐng)求分析這個(gè)接口,分析其中的響應(yīng)信息。
???~?curl?https://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&nc=1614319565639&pid=hp&FORM=BEHPTB&uhd=1&uhdwidth=3840&uhdheight=2160 {"images":?[{"startdate":?"20210225","fullstartdate":?"202102251600","enddate":?"20210226","url":?"/th?id=OHR.JinliStreet_ZH-CN3020276206_UHD.jpg&rf=LaDigue_UHD.jpg&pid=hp&w=3840&h=2160&rs=1&c=4","urlbase":?"/th?id=OHR.JinliStreet_ZH-CN3020276206","copyright":?"掛在錦里街上的紅燈籠,中國成都?(??Philippe?LEJEANVRE/Getty?Images)","copyrightlink":?"/search?q=%e9%94%a6%e9%87%8c%e8%a1%97&form=hpcapt&mkt=zh-cn","title":?"","quiz":?"/search?q=Bing+homepage+quiz&filters=WQOskey:%22HPQuiz_20210225_JinliStreet%22&FORM=HPQUIZ","wp":?true,"hsh":?"e9b5fb1ad61034342e8d459bff8fc5c5","drk":?1,"top":?1,"bot":?1,"hs":?[]}],"tooltips":?{"loading":?"正在加載...","previous":?"上一個(gè)圖像","next":?"下一個(gè)圖像","walle":?"此圖片不能下載用作壁紙。","walls":?"下載今日美圖。僅限用作桌面壁紙。"} } ???~可以看到返回的結(jié)果中有 URL 信息,拼接到必應(yīng)網(wǎng)址訪問測試(其實(shí)通過響應(yīng)信息里的圖片描述 ”掛在錦里街上的紅燈籠,中國成都“ 就已經(jīng)猜到大概率是了,今日元宵節(jié))。
https://bing.com/th?id=OHR.JinliStreet_ZH-CN3020276206_UHD.jpg&rf=LaDigue_UHD.jpg&pid=hp&w=3840&h=2160&rs=1&c=4訪問后發(fā)現(xiàn)就是必應(yīng)搜索網(wǎng)站的當(dāng)日壁紙(元宵節(jié)必應(yīng)放了一張紅色燈籠壁紙)。
元宵節(jié)到這里,我們已經(jīng)找到了必應(yīng)搜索壁紙的 API 接口和響應(yīng)信息中的圖片地址。如果再看圖片的 URL 地址,其中攜帶了不少參數(shù),這些參數(shù)是什么意思呢?可以大膽猜測,其中的參數(shù) w=3840&h=2160 應(yīng)該是指圖片的寬和高,確實(shí)是這樣,調(diào)整這兩個(gè)參數(shù)可以返回不同分辨率的圖片,如果沒有這兩個(gè)參數(shù)就可以返回超清原圖。
?
必應(yīng)壁紙爬蟲
上面分析出了必應(yīng)壁紙的 API ,那么就不難寫一個(gè)自動(dòng)爬取當(dāng)天必應(yīng)壁紙的自動(dòng)化程序。
請(qǐng)求必應(yīng)壁紙 API。
JSON 解析出圖片 URL。
這里網(wǎng)絡(luò)請(qǐng)求使用 Java 原生寫法,JSON 解析使用了 FASTJSON ,代碼簡單直接放上來了。
/***?<p>*?網(wǎng)絡(luò)請(qǐng)求操作工具類**?@author?niujinpeng*?@link?https://github.com/niumoo*/ public?class?HttpUtls?{/***?獲取?HTTP?連接**?@param?url*?@return*?@throws?IOException*/public?static?HttpURLConnection?getHttpUrlConnection(String?url)?throws?IOException?{URL?httpUrl?=?new?URL(url);HttpURLConnection?httpConnection?=?(HttpURLConnection)httpUrl.openConnection();httpConnection.setRequestProperty("User-Agent",?"Mozilla/5.0?(Windows?NT?10.0;?Win64;?x64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/83.0.4103.116?Safari/537.36");return?httpConnection;}/***?請(qǐng)求指定?URL?的內(nèi)容**?@param?url*?@return*?@throws?IOException*/public?static?String?getHttpContent(String?url)?throws?IOException?{HttpURLConnection?httpUrlConnection?=?getHttpUrlConnection(url);StringBuilder?stringBuilder?=?new?StringBuilder();//?獲得輸入流try?(InputStream?input?=?httpUrlConnection.getInputStream();?BufferedInputStream?bis?=?new?BufferedInputStream(input);)?{byte[]?buffer?=?new?byte[1024];int?len?=?-1;//?讀到文件末尾則返回-1while?((len?=?bis.read(buffer))?!=?-1)?{stringBuilder.append(new?String(buffer,?0,?len));}}?catch?(Exception?e)?{e.printStackTrace();}?finally?{httpUrlConnection.disconnect();}return?stringBuilder.toString();}}如果覺得 Java 原生網(wǎng)絡(luò)請(qǐng)求寫法繁瑣,也可以使用 OkHTTP 進(jìn)行請(qǐng)求。請(qǐng)求到響應(yīng)結(jié)果之后,使用 FASTJSON 解析響應(yīng)的結(jié)果。
/***?@author?niujinpeng*?@link?https://github.com/niumoo*/ public?class?Wallpaper?{//?BING?APIprivate?static?String?BING_API?=?"https://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&nc=1612409408851&pid=hp&FORM=BEHPTB&uhd=1&uhdwidth=3840&uhdheight=2160";private?static?String?BING_URL?=?"https://cn.bing.com";public?static?void?main(String[]?args)?throws?IOException?{String?httpContent?=?HttpUtls.getHttpContent(BING_API);JSONObject?jsonObject?=?JSON.parseObject(httpContent);JSONArray?jsonArray?=?jsonObject.getJSONArray("images");//?圖片地址String?url?=?BING_URL?+?(String)jsonArray.getJSONObject(0).get("url");url?=?url.substring(0,?url.indexOf("&"));//?圖片時(shí)間String?enddate?=?(String)jsonArray.getJSONObject(0).get("enddate");//?圖片版權(quán)String?copyright?=?(String)jsonArray.getJSONObject(0).get("copyright");//?格式化為?MD?格式String?text?=?String.format("%s?|?[%s](%s)?",?enddate,?copyright,?url)?+?System.lineSeparator();System.out.println(text);//?寫入?MD?文件Path?path?=?Paths.get("README.md");if?(!Files.exists(path))?{Files.createFile(path);}List<String>?allLines?=?Files.readAllLines(path);allLines.set(0,?text);Files.write(path,?"##?Bing?Wallpaper".getBytes());Files.write(path,?System.lineSeparator().getBytes(),?StandardOpenOption.APPEND);Files.write(path,?allLines,?StandardOpenOption.APPEND);} }運(yùn)行之后就可以得到必應(yīng)網(wǎng)站當(dāng)天的壁紙信息。
20210226?|?[掛在錦里街上的紅燈籠,中國成都?(??Philippe?LEJEANVRE/Getty?Images)](https://cn.bing.com/th?id=OHR.JinliStreet_ZH-CN3020276206_UHD.jpg)??
Github?Actions
如果我們想要收集每天的必應(yīng)壁紙,豈不是每天都要運(yùn)行一次爬蟲程序?這顯然太麻煩了。如果有個(gè)定時(shí)任務(wù)每天自動(dòng)執(zhí)行一次,豈不妙哉?但是掛在服務(wù)器上還需要購買一臺(tái)虛擬主機(jī),實(shí)在得不償失。
這時(shí)機(jī)智的我突然想到何不利用 Github Actions 功能呢?Github Actions 可以執(zhí)行多種常見環(huán)境的程序,而且可以定時(shí)觸發(fā),免費(fèi)好用,實(shí)在是妙,心中默默的也為微軟豎起了大拇指。
img下面會(huì)簡單介紹一下 Github Actions 的使用,更多的關(guān)于 Github Actions 的概念和使用的場景就不介紹了,我們只要知道利用 Github Actions 功能,可以讓我們?cè)谥付ǖ?strong>事件觸發(fā)(代碼提交事件或者定時(shí)或者其他)時(shí),可以運(yùn)行指定的程序就好了。
如果想了解更多的相關(guān)資料,可以直接參考 Github Actions 官方文檔,也可以參考其他的相關(guān)中文教程,鏈接這里已經(jīng)放在文章末尾了。
Github Actions 體驗(yàn)
在 Github 倉庫頁面的 Actions 頁簽下可以創(chuàng)建 Github Actions 配置,這里創(chuàng)建一個(gè)官方提供的簡單示例進(jìn)行演示。
Github Actions創(chuàng)建后可以得到一個(gè)官方編寫好的 Actions Demo,功能就是輸出幾個(gè)字符串。
GitHub Actions簡單介紹一下圖中 Actions 配置文件中的的一些概念。
on 指定此 Actions 的觸發(fā)機(jī)制,這里的 push 和 pull_request 說明在代碼提交和代碼合并時(shí)會(huì)觸發(fā)。
jobs 代表一個(gè)任務(wù),一個(gè) Actions workflows 可以有多個(gè) jobs 構(gòu)成。
runs-on 指定運(yùn)行 Actions 的系統(tǒng)環(huán)境,這里是 ubuntu.
steps 代表當(dāng)前 jobs 任務(wù)的執(zhí)行步驟。示例里先檢出了倉庫,然后echo 了幾個(gè)字符串。
保存提交這個(gè)文件到倉庫,因?yàn)榕渲美锱渲昧擞|發(fā)機(jī)制有 push,所以這時(shí)也會(huì)觸發(fā)這個(gè)任務(wù)。
Github Actions?
Github Actions 定時(shí)抓取必應(yīng)壁紙
已經(jīng)簡單體驗(yàn)了 Github Actions 的使用方式,還記得我們上面編寫了一個(gè)簡單的必應(yīng)壁紙 Java 版爬蟲嗎?如果我們把爬蟲代碼提交到倉庫,然后使用 Github Actions 功能定時(shí)檢出倉庫運(yùn)行 Java 代碼抓取壁紙,再寫入壁紙到倉庫,一套下來無服務(wù)器零成本豈不是很好?
先直接附上寫好的 Github 倉庫地址:https://github.com/niumoo/bing-wallpaper ,已經(jīng)可以每天自動(dòng)抓取當(dāng)天必應(yīng)壁紙。
下面是關(guān)于 Actions 內(nèi)容的一些說明。
#?This?workflow?will?build?a?Java?project?with?Maven #?For?more?information?see:?https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-mavenname:?Java?CI?with?Maven on:schedule:#?定時(shí)執(zhí)行,Runs?at?17:00?UTC?every?day-?cron:??'0?17?*?*?*'jobs:build:runs-on:?ubuntu-lateststeps:-?uses:?actions/checkout@v2-?name:?Set?up?JDK?1.8uses:?actions/setup-java@v1with:java-version:?1.8-?name:?Build?with?Mavenrun:?mvn?-B?package?--file?pom.xml-?name:?Run?Java?Applicationrun:?java?-jar?target/bing-wallpaper-jar-with-dependencies.jar-?name:?Commit?filesrun:?|git?config?--local?user.email?"your_github_email@126.com"git?config?--local?user.name?"your_github_name"git?add?README.mdgit?commit?-m?"update?readme.md"-?name:?Push?changesuses:??ad-m/github-push-action@masterwith:github_token:?${{?secrets.MY_GIT_TOKEN?}}branch:?main配置中定時(shí)在每天 UTC 時(shí)間 17 點(diǎn)運(yùn)行一次,從 steps 可以看到執(zhí)行步驟。
檢出代碼。
設(shè)置 Java 環(huán)境為 JDK 1.8.
maven 編譯打包。
運(yùn)行打包后的 Java 程序(程序中把獲取到的壁紙寫入到了 README.md 文件)。
提交文件到 Github 倉庫。
配置中最后還使用了一個(gè)參數(shù) {{ secrets.MY_GIT_TOKEN }} ,這是一個(gè)用于識(shí)別是否有提交 Github權(quán)限的密文,這個(gè)密文可以在 Github 網(wǎng)站 -> 點(diǎn)擊頭像 -> Settings -> Developer settings -> Personal access tokens 這里創(chuàng)建,或者直接訪問 https://github.com/settings/tokens/new 創(chuàng)建,創(chuàng)建時(shí)勾選 repo 權(quán)限。保存后可以得到你的密文。
Github personal access tokens復(fù)制這串密文,配置到自己創(chuàng)建 Actions 的倉庫。
Github Actions Secrets至此,倉庫和配置都已經(jīng)完成,每天自動(dòng)抓取必應(yīng)首頁壁紙寫入到 README.md 文件,下圖是抓取的效果。
bing-wallpaperGithub 倉庫地址:https://github.com/niumoo/bing-wallpaper 。
?
參考
[1] https://docs.github.com/en/actions/quickstart
[2] https://github.com/niumoo/bing-wallpaper
有道無術(shù),術(shù)可成;有術(shù)無道,止于術(shù)
歡迎大家關(guān)注Java之道公眾號(hào)
好文章,我在看??
總結(jié)
以上是生活随笔為你收集整理的我是如何白嫖 Github 服务器自动抓取每日必应壁纸的?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: EF中 GroupJoin 与 Join
- 下一篇: 做中间件的这两年总结(201704-20