摘要:微博圖床對于微博圖床的理解得力于這篇文章利用微博當(dāng)圖床語言實(shí)現(xiàn)。源碼如下上傳圖片到微博圖床圖片文件圖片是否采用方式上傳返回的數(shù)據(jù)微博提交正則表達(dá)式提取返回結(jié)果中的數(shù)據(jù)微博機(jī)器人源碼列舉了所要用到的幾個重要,最后還是貼一下機(jī)器人的源碼吧。
? 在2011年的時候,浙大的一位博士生借助微博的開放平臺為他實(shí)驗(yàn)室的一臺飲水機(jī)弄了個微博,名喚@浙大CCNT實(shí)驗(yàn)室飲水機(jī),俗稱“飲水機(jī)娘“。當(dāng)年這條新聞給自己留下了挺大的印象,也一直對這個微博賬號可以自動發(fā)微博背后的機(jī)理感到十分憧憬。一晃,時間都來到了2019年了~~
? 咳咳——在鉆研不少技術(shù)文章以及對技術(shù)派網(wǎng)友的多多請教后,自己終于也搗弄了一個自動發(fā)微博的機(jī)器人( ̄︶ ̄)↗
? 此微博機(jī)器人的功能如下:
直接模擬登陸新浪微博;
自動獲取唐詩宋詞文本;
自動獲取文藝主題圖片;
自動上傳圖片至微博圖床;
自動發(fā)送內(nèi)容不同的圖文微博;
通過定時任務(wù),實(shí)現(xiàn)周期性發(fā)微博任務(wù)。
? 實(shí)際效果圖:
? GitHub倉庫:
https://github.com/Leslie-Won...
? 正所謂“前不見古人,后不見來者。念天地之悠悠,獨(dú)愴然而涕下!“,咳咳——IT技術(shù)世界當(dāng)然不是這樣,我們的技術(shù)積累都是站在前人的基礎(chǔ)上的,換言之,站在巨人的肩膀上。所以,還是先來啰嗦啰嗦當(dāng)年的飲水機(jī)娘。
飲水機(jī)娘分析? 當(dāng)年果殼網(wǎng)在飲水機(jī)娘爆紅了的時候,采訪了背后的開發(fā)者——浙江大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院的一位陳姓博士生。文章標(biāo)題是《揭開“飲水機(jī)娘”的神秘面紗》。在這篇文章中,闡述發(fā)微博原理的段落如下:
據(jù)陳同學(xué)介紹,飲水機(jī)本身并沒有多加改造,只是飲水機(jī)上安裝一個攝像頭,鏡頭正對加熱指示燈,作為傳感器,實(shí)時監(jiān)控加熱狀態(tài)。發(fā)送微博的功能通過代碼實(shí)現(xiàn),利用了新浪微博開放平臺提供的PHP語言軟件開發(fā)工具包。在代碼的設(shè)計中,主要有檢測模塊和反應(yīng)模塊兩部分。檢測模塊處理攝像頭的監(jiān)控數(shù)據(jù),捕捉加熱指示燈“亮->不亮”與“不亮->亮”兩個切換狀態(tài),然后調(diào)用反應(yīng)模塊及時發(fā)送微博。所以在“飲水機(jī)娘”自動發(fā)送的微博下方,會顯示“來自未通過審核應(yīng)用”。目前,完成這些功能,所需的代碼量不足兩百行。
? 現(xiàn)在來分析分析這兩段話,把整個流程弄成流程圖的話是如下的效果:
? 從“指示燈”到“視覺算法判斷狀態(tài)”這部分屬于計算機(jī)視覺實(shí)現(xiàn)了,依本人目前的技術(shù)視野判斷,可以借助openCV來構(gòu)建。至于發(fā)送微博這一部分,則是純粹的PHP代碼實(shí)現(xiàn)。由于本文所要討論的是構(gòu)建一個發(fā)微博的機(jī)器人,而微博報文數(shù)據(jù)的獲取可以有很多種方式,因此,openCV就點(diǎn)到為止了。(自己也不是太懂openCV)(。?_?)/~~~
? 自己在查閱了不少技術(shù)文獻(xiàn)后,通過這篇《新浪微博自動(模擬)登陸詳解及實(shí)現(xiàn)》了解到飲水機(jī)娘發(fā)送的微博下方會出現(xiàn)“來自未通過審核應(yīng)用”是由于用了新浪微博開放平臺的接口的緣故,而且其會有幾個比較致命的限制(調(diào)用次數(shù)限制和授權(quán)期限限制)。網(wǎng)上流傳一種直接模擬登陸微博的解決方案,關(guān)鍵點(diǎn)就是利用php的curl功能,這也是本人所要闡述的微博機(jī)器人使用的登錄原理。
? 另外,翻了翻飲水機(jī)娘最早期發(fā)送的微博,報告飲水機(jī)水沸騰了的微博報文是這樣子的——
? 后來變成了這樣子——
? 而對應(yīng)“亮->不亮”狀態(tài)的微博報文最初是這樣子的——
? 不過,后來關(guān)注度上去之后,就很難判斷飲水機(jī)娘發(fā)送的微博是不是根據(jù)飲水機(jī)狀態(tài)自動發(fā)出去了的了,但是也不影響本文后續(xù)的敘述。OK,溯源的部分就到這里,接下來講講在機(jī)器人構(gòu)建中占據(jù)不少分量的數(shù)據(jù)獲取API——今日詩詞API、文藝主題圖片API、微博圖床API。
今日詩詞API? 今日詩詞API是亂碼開發(fā)的一個可以返回一句古詩詞名句的接口。它可以通過圖片和JSON格式調(diào)用。今日詩詞API根據(jù)不同地點(diǎn)、時間、節(jié)日、季節(jié)、天氣、景觀、城市、事件進(jìn)行智能推薦。
? 官方文檔地址是https://www.jinrishici.com/, 亂碼大佬撰寫的介紹文章則是https://luan.ma/post/jinrishici/。就本人所要構(gòu)建的微博機(jī)器人而言,使用到的接口是https://v2.jinrishici.com/one...,而且是使用帶token的調(diào)用方式。
文藝主題圖片API? 這個圖片API是九凌少子負(fù)責(zé)開發(fā)的,他的圖源來自于360壁紙,主要功能就是根據(jù)調(diào)用需求,返回一張360壁紙的官方服務(wù)器上的圖片URL。調(diào)用方式如下:
https://www.yuluoge.com/api/i...
? 不同的cid值對應(yīng)不同的分類,根據(jù)他的解釋及本人測試,分類如下——
cid=0 —— 默認(rèn)圖片,不分類型
cid=1 —— 美女
cid=2 —— 動漫
cid=3 —— 風(fēng)景
cid=4 —— 游戲
cid=5 —— 文藝
cid=6 —— 文字控
cid=7 —— 動物
cid=8 —— 愛情
? 此外,這篇文章最后貼出來的源代碼是基于他在今日詩詞的Q群里分享的發(fā)微博源碼改造而來的,在此感謝他的貢獻(xiàn)。
微博圖床API? 對于微博圖床API的理解得力于這篇文章——《利用微博當(dāng)圖床-php語言實(shí)現(xiàn)》。
? 使用到的微博圖片上傳接口為
http://picupload.service.weib...
? 本文所構(gòu)建機(jī)器人略有改動地使用了這篇文章里的獲取新浪圖床圖片pid的PHP源碼。源碼如下:
/** * 上傳圖片到微博圖床 * @author mengkun http://mkblog.cn * @param $file 圖片文件/圖片url * @param $multipart 是否采用multipart方式上傳 * @return 返回的json數(shù)據(jù) */ function upload($file, $multipart = true) { $cookie = ""; // 微博cookie $url = "http://picupload.service.weibo.com/interface/pic_upload.php" ."?mime=image%2Fjpeg&data=base64&url=0&markpos=1&logo=&nick=0&marks=1&app=miniblog"; if($multipart) { $url .= "&cb=http://weibo.com/aj/static/upimgback.html?_wv=5&callback=STK_ijax_".time(); if (class_exists("CURLFile")) { // php 5.5 $post["pic1"] = new CURLFile(realpath($file)); } else { $post["pic1"] = "@".realpath($file); } } else { $post["b64_data"] = base64_encode(file_get_contents($file)); } // Curl提交 $ch = curl_init($url); curl_setopt_array($ch, array( CURLOPT_POST => true, CURLOPT_VERBOSE => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => array("Cookie: $cookie"), CURLOPT_POSTFIELDS => $post, )); $output = curl_exec($ch); curl_close($ch); // 正則表達(dá)式提取返回結(jié)果中的json數(shù)據(jù) preg_match("/({.*)/i", $output, $match); if(!isset($match[1])) return ""; return $match[1]; }微博機(jī)器人源碼
? 列舉了所要用到的幾個重要API,最后還是貼一下機(jī)器人的源碼吧。當(dāng)然,也有相對應(yīng)的GitHub倉庫https://github.com/Leslie-Won...
主模塊
//weibo.php true, CURLOPT_VERBOSE => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => array("Cookie: $cookie"), CURLOPT_POSTFIELDS => $post, )); $output = curl_exec($ch); curl_close($ch); // 正則表達(dá)式提取返回結(jié)果中的json數(shù)據(jù) preg_match("/({.*)/i", $output, $match); if(!isset($match[1])) return ""; return $match[1]; } /** 通過今日詩詞API獲取詩詞內(nèi)容 **/ function jinrishici(){ $opts = array( "http"=>array( "method"=>"GET", "header"=>"Accept-language: en "."X-User-Token: k4z4CMgTyl3JN6s+y2iWWiHN6we+0J9V " ) ); $context = stream_context_create($opts); // Open the file using the HTTP headers set above $tangshi_pailie = json_decode(file_get_contents("https://v2.jinrishici.com/one.json", false, $context),true); //今日詩詞API,帶token版本 // $tangshi_pailie = json_decode(file_get_contents("https://v2.jinrishici.com/one.json"), true); //今日詩詞api,不帶token版本 $tangshi_title = $tangshi_pailie["data"]["origin"]["title"]; //標(biāo)題 $tangshi_dynasty = $tangshi_pailie["data"]["origin"]["dynasty"]; //朝代 $tangshi_author = $tangshi_pailie["data"]["origin"]["author"]; //詩人 $tangshi_line_numbers = count($tangshi_pailie["data"]["origin"]["content"]); $tangshi_content = $tangshi_pailie["data"]["origin"]["content"][0]; for ($i=1; $i < $tangshi_line_numbers; $i++) { $tangshi_temp_line = $tangshi_pailie["data"]["origin"]["content"][$i]; $tangshi_content = $tangshi_content." ".$tangshi_temp_line; } //拼接全詩 $post_Poem = "《".$tangshi_title."》"." ".$tangshi_dynasty."·".$tangshi_author." "." ".$tangshi_content; return "$post_Poem"; } include "./wbcookie.php"; $cookie = $config["cookie"]; //通過圖片api獲取圖片,并轉(zhuǎn)存微博圖床 $bing_img = json_decode(upload("https://www.yuluoge.com/api/index.php?cid=5", $cookie, false),true); $bing_img_pid = $bing_img["data"]["pics"]["pic_1"]["pid"]; echo "$bing_img_pid "; $tangshi = jinrishici(); echo "$tangshi "; $post=[ "title" =>"今日要說什么?", "location" => "v6_content_home", "text" => "#詩詞[超話]# #中華好詩詞# #中國詩詞大會#"." ".$tangshi." "." ",//需要發(fā)送微博的內(nèi)容 "pic_id" => "$bing_img_pid", // "007CcEyfly1g042kquhztj31ns0u0tdu",//微博圖片id,需事先上傳好 "isReEdit" => false, "pub_source" => "page_2", "topic_id" => "1022%3A", "pub_type" => "dialog", "_t" => 0, "style_type" => 1, ]; $url="https://weibo.com/aj/mblog/add?ajwvr=6&__rnd=2918942797035";//不需要改變 $referer="https://weibo.com/liufengshishe/home?topnav=1&wvr=6";//你的微博用戶名(首頁鏈接) $response = curl($url,$post,"",$cookie,$referer); echo "$response 發(fā)送成功";
微博登錄模塊
20*3600||$config["cookie"]=="SUB;") { $cookie = login($sinauser,$sinapwd); if($cookie&&$cookie!="SUB;") { CookieSet($cookie,$time = time()); } else { return error("203","獲取cookie出現(xiàn)錯誤,請檢查賬號狀態(tài)或者重新獲取cookie"); } } /** * 新浪微博登錄(無加密接口版本) * @param string $u 用戶名 * @param string $p 密碼 * @return string 返回最有用最精簡的cookie */ function login($u,$p){ $loginUrl = "https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)&_=1403138799543"; $loginData["entry"] = "sso"; $loginData["gateway"] = "1"; $loginData["from"] = "null"; $loginData["savestate"] = "30"; $loginData["useticket"] = "0"; $loginData["pagerefer"] = ""; $loginData["vsnf"] = "1"; $loginData["su"] = base64_encode($u); $loginData["service"] = "sso"; $loginData["sp"] = $p; $loginData["sr"] = "1920*1080"; $loginData["encoding"] = "UTF-8"; $loginData["cdult"] = "3"; $loginData["domain"] = "sina.com.cn"; $loginData["prelt"] = "0"; $loginData["returntype"] = "TEXT"; return loginPost($loginUrl,$loginData); } /** * 發(fā)送微博登錄請求 * @param string $url 接口地址 * @param array $data 數(shù)據(jù) * @return json 算了,還是返回cookie吧//返回登錄成功后的用戶信息json */ function loginPost($url,$data){ $tmp = ""; if(is_array($data)){ foreach($data as $key =>$value){ $tmp .= $key."=".$value."&"; } $post = trim($tmp,"&"); }else{ $post = $data; } $ch = curl_init(); curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch,CURLOPT_HEADER,1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch,CURLOPT_POST,1); curl_setopt($ch,CURLOPT_POSTFIELDS,$post); $return = curl_exec($ch); curl_close($ch); return "SUB" . getSubstr($return,"Set-Cookie: SUB","; ") . ";"; } /** * 取本文中間 */ function getSubstr($str,$leftStr,$rightStr){ $left = strpos($str, $leftStr); echo "左邊:".$left; $right = strpos($str, $rightStr,$left); echo "
右邊:".$right; if($left <= 0 or $right < $left) return ""; return substr($str, $left + strlen($leftStr), $right-$left-strlen($leftStr)); } /** 設(shè)置cookie文件 */ function CookieSet($cookie,$time){ $newConfig = " "".$cookie."", "time" => "".$time."", );"; @file_put_contents("./wbcookie.php", $newConfig); } /** 錯誤反饋 */ function error($code,$msg){ $arr = array("code"=>$code,"msg"=>$msg); echo json_encode($arr); }
微博賬號模塊
關(guān)于如何使用? 本地搭建了lamp環(huán)境的話,開啟lamp環(huán)境后,直接在瀏覽器地址欄輸入localhost及主入口文件對應(yīng)的路徑就可以運(yùn)行了(本人使用xampp)。
? 云服務(wù)器的話,本人的方案是使用寶塔服務(wù)器面板安裝lamp環(huán)境后,使用xftp將文件傳到apache服務(wù)器網(wǎng)站根目錄上,開啟lamp環(huán)境就可以了的。
關(guān)于安全性問題? 實(shí)不相瞞,如果是在云服務(wù)器上直接跑這些php文件的話,是不太安全的。因?yàn)榫W(wǎng)站的公共用戶具有可以訪問微博賬號文件的權(quán)限。所以,推薦對微博賬號文件進(jìn)行.htaccess設(shè)置,也推薦申請個小號來搭建。
? 具體操作有點(diǎn)復(fù)雜,可以參考這篇文章——《apache .htaccess文件詳解和配置技巧總結(jié)》
關(guān)于定時任務(wù)? 設(shè)置定時任務(wù)的話可以使用linux主機(jī)的crontab命令。
遠(yuǎn)程連接主機(jī),連接成功后,輸入命令crontab -e;
會打開一個文件,按照格式輸入需要執(zhí)行的腳本;
保存退出后,重啟crontab服務(wù)。
語法解釋:
“*” 代表取值范圍內(nèi)的數(shù)字,
參考文獻(xiàn)
“/” 代表”每”,
“-” 代表從某個數(shù)字到某個數(shù)字,
“,” 分開幾個離散的數(shù)字《揭開“飲水機(jī)娘”的神秘面紗》《新浪微博自動(模擬)登陸詳解及實(shí)現(xiàn)》
《今日詩詞開放接口-調(diào)用文檔》
《利用微博當(dāng)圖床-php語言實(shí)現(xiàn)》
《apache .htaccess文件詳解和配置技巧總結(jié)》
《linux下crontab定時訪問指定url》
特別致謝九凌少子
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/31020.html
摘要:僅供學(xué)習(xí)交流,請勿用于商業(yè)用途,并遵守新浪微博相關(guān)規(guī)定。代碼目錄此微博機(jī)器人的實(shí)現(xiàn)功能如下模擬登陸新浪微博獲取自動上傳圖片至微博圖床自動發(fā)送內(nèi)容不同的圖文微博通過定時任務(wù),實(shí)現(xiàn)周期性發(fā)微博任務(wù)。 僅供學(xué)習(xí)交流,請勿用于商業(yè)用途,并遵守新浪微博相關(guān)規(guī)定。 代碼目錄 showImg(https://segmentfault.com/img/bVbqe6W?w=634&h=580); 此微博...
摘要:今天就用來上傳圖片到微博,這也是來自的一個問題里面還提到一個版本有種方式實(shí)現(xiàn)上傳圖片如果要用這個的話參數(shù)必須是,值為經(jīng)過編碼后的字符串。使用上傳登錄微博獲取就是微博圖片,訪問即可打開圖片這里我上傳的是的廣告圖。 微博是個好圖床,上傳后就可以通過一個url來訪問了。今天就用php來上傳圖片到微博,這也是來自sf的一個問題, 里面還提到一個python版本. 有2種方式實(shí)現(xiàn)上傳圖片: 如...
摘要:個月后,我通過個產(chǎn)品達(dá)到了萬美元的月收入。其中第一個產(chǎn)品貢獻(xiàn)了收入的以上。 .markdown-body{word-break:break-word;line-height:1.75;font-weight:400;font-size:15px;overflow-x:hidden;color:#333}.markdown-body h1,.markdown-body h2,.markdow...
摘要:多域名配置原來的域名過期了,重新買了一個,正好重新的配置一下,針對之前寫過的幾個不同的東西,通過不同的子域名來進(jìn)行區(qū)分,因此簡單記錄一下的多域名配置域名配置背景因?yàn)橘Y金有限,只有一臺服務(wù)器,但是這個服務(wù)器上干的事情卻不止一件,當(dāng)前的狀況是有 nginx多域名配置 原來的域名過期了,重新買了一個hhui.top,正好重新的配置一下,針對之前寫過的幾個不同的東西,通過不同的子域名來進(jìn)行區(qū)分...
摘要:本文轉(zhuǎn)載自微信公眾號賬號,作者為海航生態(tài)科技技術(shù)研究院大數(shù)據(jù)開發(fā)工程師高顏。文章介紹了海航生態(tài)科技輿情大數(shù)據(jù)平臺的容器化改造經(jīng)驗(yàn),包括初期技術(shù)架構(gòu)應(yīng)用容器化架構(gòu)遷移持續(xù)發(fā)布與部署。 本文轉(zhuǎn)載自微信公眾號Docker(賬號:dockerone),作者為海航生態(tài)科技技術(shù)研究院大數(shù)據(jù)開發(fā)工程師高顏。 文章介紹了海航生態(tài)科技輿情大數(shù)據(jù)平臺的容器化改造經(jīng)驗(yàn),包括初期技術(shù)架構(gòu)、應(yīng)用容器化、架構(gòu)遷...
閱讀 1029·2023-04-25 14:41
閱讀 2492·2021-09-28 09:35
閱讀 3657·2019-08-30 15:53
閱讀 1965·2019-08-29 15:26
閱讀 1091·2019-08-28 17:59
閱讀 4354·2019-08-26 13:45
閱讀 2866·2019-08-26 13:33
閱讀 1668·2019-08-26 11:46