整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          linux中級-libcurl庫訪問百度

          linux中級-libcurl庫訪問百度


          ibcurl簡介:

          libcurl是一個跨平臺的網絡協議庫,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 協議。libcurl同樣支持HTTPS證書授權,HTTP POST, HTTP PUT, FTP 上傳, HTTP基本表單上傳,代理,cookies,和用戶認證。libcurl的官網 、庫下載。這種庫使用的時候就像使用wiringPi庫一樣,編寫完代碼需要鏈接這個庫,所以要先下載這個庫。

          libcurl等第三方庫的通用編譯方法:

          • 首先進入libcurl庫得下載界面,點擊下載libcurl庫
          • 下載完成后通過共享文件夾或者FileZill或者直接拖拽將壓縮包移動到虛擬機。我這里將壓縮包拖拽至虛擬機的共享文件夾,然后使用指令:cp /mnt/hgfs/sharefile/curl-7.71.1.tar.bz2 .將壓縮包拷貝到我新建的httpHandler這個文件夾里面,然后使用指令:tar vxf curl-7.71.1.tar.bz2解壓這個文件夾,解壓后進入文件夾,如下圖所示(之后用到的開源的庫基本都是這樣的,內容形式差不多):
          • 那么如何使用這種開源的壓縮包呢?這個文件夾下面有一個README文件夾,里面有對庫的一些說明,如下圖所示,由下圖可知,我們使用libcurl庫時可以查看curl.1手冊或者MANUAL document這個手冊
          • 這里我用有道翻譯將這些英文進行了簡單地翻譯: 自述:Curl是一個命令行工具,用于傳輸由URL(網址)指定的數據語法。通過閱讀curl了解如何使用curl。手冊頁或手冊文檔。通過閱讀install了解如何安裝Curl文檔。Libcurl是curl用來完成其工作的庫。它很容易可被您的軟件使用。閱讀libcurl。3手冊頁學習如何!你可以在FAQ文檔中找到最常見問題的答案。研究copy文件中的分發條款和類似條款。如果你分配Curl二進制文件或其他涉及libcurl的二進制文件,您可能會喜歡LICENSE-MIXING文檔。所有這些文檔以及更多文檔都可以在docs/目錄中找到。聯系:如果您有問題、疑問、想法或建議,請與我們聯系通過郵寄到一個合適的郵寄名單。參見http//curl.haxx.se/mail/該項目的所有貢獻者都列在THANKS文檔中。網站:訪問curl網站獲取最新消息和下載:https://curl.haxx.se/,GIT:要從GIT服務器上下載最新的源代碼,請這樣做:git克隆https://github.com/curl/curl.git,(您將創建一個名為curl的目錄,并填充源代碼)。安全問題:通過我們的HackerOne頁面報告可疑的安全問題,而不是在公共場合!https://hackerone.com/curl請注意:Curl包含的源代碼是版權所有?1998, 1999。終于Tekniska Hogskolan。在此附上此通知是為了遵守分布條件。
          • 通過閱讀README我們并沒有找到如何使用這個庫,然后進入到docs這個文件夾,這個文件夾是對RADME的一個補充,在這個文件夾下面我們會看到README里面提到的curl1.1這個API相關的手冊,還有INSTALL(**==這個一定要看,有時候他會和README都放在解壓后的文件夾里面,有時候會放在docs里面==**)。
          • 打開INSTALL后看到 提示說如何編譯(compile)這個庫請看INSTALL.md這個文件,打開這個文件后,里面有介紹如何安裝編譯后的libcurl庫,然后下面可以看到在UNIX環境下面如何進行安裝 如下圖所示,**./config就是配置的一個東西,就是將庫安裝到哪里,若后面不跟任何的參數,就是默認安裝(可能安裝在/usr/lib或者/usr/include下面)。**==make就是編譯的意思,make install就是將編譯后的東西拷貝到根目錄的相關文件夾下面。如果默認安裝的話可能需要root權限==因為:默認可能安裝在/usr/lib或者/usr/include下面,而訪問這兩個文件夾需要root權限。

          在這里插入圖片描述

          • 當然一般不安裝在默認的路徑下面,可以通過下圖方式指定安裝路徑
          • 通過指令:./configure --help可以查看configure都支持哪些功能參數,其中下面的HOST這個指令可以指定交叉編譯的編譯器(若不指定交叉編譯工具默認使用gcc編譯工具)。
          • 通過以下指令:./configure --prefix=$PWD/_install進行指定位置的安裝,安裝的時候會生成一個_install文件夾,庫將會被安裝到這個文件夾下面,安裝過程中沒有出現任何error表示安裝成功,然后使用指令:make進行編譯,然后使用使用指令:make install進行拷貝,然后會發現當前文件夾下面生成了一個_install文件夾,然后進入到該文件夾,如下圖所示:

          在這里插入圖片描述

          調用libcurl庫訪問百度

          調用libcurl庫訪問百度主頁并將數據保存到文件中: 程序代碼:

          #include <stdio.h>
          #include <curl/curl.h>
          
          #define true 1
          #define false 0
          typedef unsigned int bool;
          
          bool getUrl(char *filename)
          {
              CURL *curl;
              CURLcode res;
              FILE *fp;
              if ((fp=fopen(filename, "w"))==NULL)  // 返回結果用文件存儲
                  return false;
              struct curl_slist *headers=NULL;
              headers=curl_slist_append(headers, "Accept: Agent-007");
              curl=curl_easy_init();    // 初始化
              if (curl)
              {
                  //curl_easy_setopt(curl, CURLOPT_PROXY, "10.99.60.201:8080");// 代理
                  curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);// 改協議頭
                  curl_easy_setopt(curl, CURLOPT_URL,"http://www.baidu.com");
                  curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); //將返回的http頭輸出到fp指向的文件
                  curl_easy_setopt(curl, CURLOPT_HEADERDATA, fp); //將返回的html主體數據輸出到fp指向的文件
                  res=curl_easy_perform(curl);   // 執行
                  if (res !=0) {
          
                      curl_slist_free_all(headers);
                      curl_easy_cleanup(curl);
                  }
                  fclose(fp);
                  return true;
              }
          }
          bool postUrl(char *filename)
          {
              CURL *curl;
              CURLcode res;
              FILE *fp;
              if ((fp=fopen(filename, "w"))==NULL)
                  return false;
              curl=curl_easy_init();
              if (curl)
              {
                  curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/tmp/cookie.txt"); // 指定cookie文件
                  curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "&logintype=uid&u=xieyan&psw=xxx86");    // 指定post內容
                  //curl_easy_setopt(curl, CURLOPT_PROXY, "10.99.60.201:8080");
                  curl_easy_setopt(curl, CURLOPT_URL, " http://mail.sina.com.cn/cgi-bin/login.cgi ");   // 指定url
                  curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
                  res=curl_easy_perform(curl);
                  curl_easy_cleanup(curl);
              }
              fclose(fp);
              return true;
          }
          int main(void)
          {
              getUrl("/tmp/get.html");
              postUrl("/tmp/post.html");
          }
          

          大概解讀代碼: 要用一個是getUrl,一個是postUrl,用getpost兩種方法來請求的一個網頁。 getUrl,我們來看一下,是自己封裝的這個函數,fopen這個函數去打開了一個文件,放在fp這個流里面。然后curl_easy_init去做初始化,去初始化我們的curl引擎,初始化成功以后curl_easy_setopt去設置curl相關的項, 包括我們要訪問的IP地址等等,還有一個CURLOPT_WRITEDATA。訪問成功數據返回以后呢會把數據流導入到這個filename這個文件里面,那filename文件是哪里呢?在/tmp/get.html。這文件如果沒有的話,他這邊fp=fopen(filename, "w")應該會創建啊,去回顧一下文件相關的操作。然后將返回的 html主體數據輸出到fp指向的文件 ,**百度的訪問的所有結果往文件里面去寫**,然后curl_easy_perform執行就是在訪問百度,如果res !=0,這個res不等于零是啥意思呢?我們去回顧一下之前提到的這個進行http請求以后的一個返回值,如果請求成功以后啊,我們去釋放這相關的curl的這個句柄。并且關閉這個文件,return true;訪問成功,這個是相關的步驟

          • 使用指令: gcc demo1.c -I ./curl-7.71.1/_install/include/ -L./curl-7.71.1/_install/lib/ -lcurl進行編譯,**-I是指定頭文件的查找路徑,-L是指定庫文件的查找路徑,同時還要-l curl,編譯后的執行文件在執行的時候出現以下圖中錯誤: 因為在程序執行的時候,默認去/usr/lib去找庫**,然而沒有找到,所以我們要設置動態庫的環境遍變量:使用指令:export LD_LIBRARY_PATH=庫的路徑,這種方法臨時有效,永久生效的環境變量設置,編輯/etc/profile即可。也可以修改工作目錄下的.bashrc 文件。 linux動態庫,靜態庫

          通過以上設置然后再執行程序:可以看到/tmp/get.html這個文件夾里面有從百度網頁獲取的html代碼:

          libcurl庫函數介紹:

          curl_global_init(long flags)函數:

          libcurl的使用(其實和socket編程時一樣,都需要一定的步驟):

          調用curl_global_init()初始化libcurl,(就像初始化套接字)

          調用curl_easy_init()函數得到 easy interface型指針(這個指針用來各種配置)

          調用curl_easy_setopt()設置傳輸選項(通過調curl_easy_setopt這個函數來對指針進行各種配置,比如:請求的方式)

          根據curl_easy_setopt()設置的傳輸選項,實現回調函數以完成用戶特定任務

          調用curl_easy_perform()函數進行訪問請求

          調用curl_easy_cleanup()釋放內存

          函數簡介

          CURLcode curl_global_init(long flags) 功能:初始化libcurl 這個函數只能用一次。(其實在調用curl_global_cleanup 函數后仍然可再用) 如果這個函數在curl_easy_init函數調用時還沒調用它將由libcurl庫自動調用 所以多線程下最好主動調用該函數以防止在線程中curl_easy_init時多次調用。

          注意:雖然libcurl是線程安全的,但curl_global_init是不能保證線程安全的, 所以不要在每個線程中都調用curl_global_init,應該將該函數的調用放在主線程中。

          參數:flags
          CURL_GLOBAL_ALL                      //初始化所有的可能的調用。
          CURL_GLOBAL_SSL                      //初始化支持 安全套接字層。
          CURL_GLOBAL_WIN32            //初始化win32套接字庫。
          CURL_GLOBAL_NOTHING         //沒有額外的初始化。
          
          • void curl_global_cleanup(void)函數: 結束libcurl使用的時候,用來對curl_global_init做的工作清理。類似于close的函數。注意:雖然libcurl是線程安全的,但curl_global_cleanup是不能保證線程安全的,所以不要在每個線程中都調用curl_global_init,應該將該函數的調用放在主線程中。
          • char * curl_version( )函數: 打印當前libcurl庫的版本。
          • CURL * curl_easy_init( )函數: curl_easy_init用來初始化一個CURL的指針(有些像返回FILE類型的指針一樣).相應的在調用結束時要用url_easy_cleanup函數清理.一般curl_easy_init意味著一個會話的開始.它會返回一個easy_handle(CURL*對象), 一般都用在easy系列的函數中.
          • void curl_easy_cleanup(CURL * handle) 函數: 這個調用用來結束一個會話.與curl_easy_init配合著用. 參數: CURL類型的指針.

          CURLcode curl_easy_setopt(CURL * handle, CURLoption option,parameter)函數:

          這個函數最重要了.幾乎所有的curl 程序都要頻繁的使用它.它告訴curl庫.程序將有如何的行為. 比如要查看一個網頁的html代碼等.(這個函數有些像ioctl函數)

          參數:

          CURL類型的指針

          各種CURLoption類型的選項.(都在curl.h庫里有定義,man 也可以查看到)

          parameter 這個參數 既可以是個函數的指針,也可以是某個對象的指針,也可以是個long型的變量.它用什么這取決于第二個參數. CURLoption 這個參數的取值很多.具體的可以查看man手冊.

          • CURLcode curl_easy_perform(CURL *handle)函數; 在初始化CURL類型的指針 以及curl_easy_setopt完成后調用. 就像字面的意思所說perform就像是個舞臺.讓我們設置的 option 運作起來.參數: CURL類型的指針.

          hrome 126 于近期發布了穩定版本,其中一個比較有意思的更新是給 HTML 帶來一個新的元素:<permission> ,它將從這個版本開始試用,并且正在努力走向標準化。

          今天我們一起來看下這個 <permission> 元素的用法。

          Web 權限提示的問題

          當 Web 應用程序需要訪問瀏覽器的高級功能時,需要向用戶主動請求許可。例如,當百度地圖使用 Geolocation API 獲取用戶的地理位置時,瀏覽器會提示用戶申請權限,這是權限規范中定義明確的概念。

          申請權限的觸發方式一般分為兩類,被動隱式觸發,或者主動顯示觸發:

          例如,Geolocation API 是一個強大的 API,它的使用依賴于首次使用時隱式詢問的方法。例如,當程序調用 navigator.geolocation.getCurrentPosition() 方法時,權限提示框會在第一次調用時自動彈出,還有另外一個例子是 navigator.mediaDevices.getUserMedia()

          一些其他的 API,如 Notification APIDevice Orientation API,通常有一種顯式的方式通過靜態方法來請求權限,如 Notification.requestPermission()DeviceMotionEvent.requestPermission()

          網站可以在加載時立即調用諸如 navigator.mediaDevices.getUserMedia()Notification.requestPermission() 等方法。這會導致在用戶還沒與網站進行交互時就彈出權限提示。這就是明顯的權限濫用行為,并且影響到兩種方式,既包括首次使用時的隱含詢問,也包括提前明確請求。

          權限濫用導致瀏覽器廠商要求有像點擊按鈕或按下按鍵這樣的用戶操作,然后才會顯示權限提示。這種方法的問題在于,瀏覽器很難確定某個特定的用戶操作是否應該導致顯示權限提示。也許用戶只是因為頁面加載時間太長而在頁面上隨意某個地方隨便點擊,有些網站也變得非常擅長誘騙用戶點擊內容來觸發提示。

          另一個問題是權限提示框通常顯示的方式:在網站的 “死亡線” 之上(特別是在大屏幕上),也就是說,在應用程序能夠繪制到的瀏覽器窗口區域之外。用戶在剛剛點擊了窗口底部的一個按鈕后,可能會錯過瀏覽器窗口頂部的提示,這種情況還是挺常見的。當瀏覽器有應對權限濫用的緩解措施時,這個問題往往會更加嚴重。

          另外,用戶一旦做出了拒絕某個權限的操作,之后想要改變就不太容易了。他們得找到特定的地方,比如那個網站信息下拉菜單,然后去進行重置或調整權限的操作,而且還得重新加載頁面才行。網站也沒辦法提供很方便的途徑讓用戶快速改變權限狀態,還得詳細地告訴用戶怎么去找到地方改變設置。

          如果某個權限是非常重要的,比如視頻會議軟件要用麥克風權限,那像谷歌會議這類的軟件就會彈出很顯眼的對話框來告訴用戶怎么去把之前阻止的權限給開通。

          <permission>元素

          為了解決上面的這些問題,<permission> 元素誕生了。這個元素允許開發者以聲明方式請求使用權限,如下例所示:

          <permission type="camera" />

          “type” 屬性代表你正在請求的權限列表(如果有多個可以以空格分割)。目前,允許的值是 'camera''microphone' 以及 'camera microphone'。默認情況下,這個元素呈現出來的樣子類似于具有最簡用戶代理樣式的按鈕。

          對于某些允許附加參數的權限,type-ext 屬性接受以空格分隔的鍵值對,例如 precise:true 地理位置權限。

          當用戶與 <permission> 元素交互時,他們可以循環經歷各個階段:

          如果他們之前不允許某項功能,他們可以在每次訪問時允許該功能,或者在當前訪問時允許該功能。

          如果他們之前允許該功能,他們可以繼續允許,或者停止允許。

          如果他們之前不允許某項功能,他們可以繼續不允許它,或者這次允許它。

          <permission> 元素的文本會根據狀態自動更新。例如,如果已授予使用某項功能的權限,則文本會更改為表示允許使用該功能。如果需要先授予權限,則文本會更改為邀請用戶使用該功能。將之前的屏幕截圖與以下屏幕截圖進行比較,以查看這兩種狀態。

          <permission> 元素可以與 Permissions API 一起使用。有許多事件可供監聽:

          • onpromptdismiss:當元素觸發的權限提示被用戶關閉(例如,單擊關閉按鈕或單擊提示之外)時,會觸發此事件。
          • onpromptaction:當元素觸發的權限提示已被用戶對提示本身采取某種操作解決時,觸發此事件。這并不一定意味著權限狀態已經改變,用戶可能已經采取了維持現狀的操作(例如繼續允許權限)。
          • onvalidationstatuschange:當元素從 "valid" 切換到 "invalid" 時觸發此事件,例如當元素被其他超文本標記語言內容部分遮擋時,會認為是 "invalid"。

          我們可以直接在 HTML 代碼中內聯注冊這些事件的事件監聽器(<permission type="…" onpromptdismiss="alert('The prompt was dismissed');" />),或者在 <permission> 元素上使用 addEventListener()

          <permission type="camera" />
          <script>
            const permission=document.querySelector('permission');
            permission.addEventListener('promptdismiss', showCameraWarning);
          
            function showCameraWarning() {
              // Show warning that the app isn't fully usable
              // unless the camera permission is granted.
            }
          
            const permissionStatus=await navigator.permissions.query({name: "camera"});
            permissionStatus.addEventListener('change', ()=> {
              // Run the check when the status changes.
              if (permissionStatus.state==="granted") {
                useCamera();
              }
              // Run the initial check.
              if (permissionStatus.state==="granted") {
                useCamera();
              }
            });
          </script>

          最后

          參考:https://developer.chrome.com/blog/permission-element-origin-trial

          為前端工程師來說,css3的運用無疑是很廣泛的,實現的奇妙效果也是豐富多彩。它的優點遠不止于能讓你的頁面酷炫非常,一個好的css3運用能給體驗者一種莫名的心曠神怡嘿嘿嘿!

          下面來看看百度是怎么使用css3的

          這是百度的首頁。鏈接:http://xuanfengge.com/demo/201406/guide/

          下面我們說說這是怎么實現的。

          首先箭頭是一張圖片,然后效果其實就是用2個相同的DOM元素利用縮放動畫使這兩個箭頭交叉閃爍。

          代碼附上:

          //兩個箭頭的html

          <a class="s-xguide-down trans" onclick="return false;" hidefocus=""></a>

          <a class="s-xguide-down arrow-1 trans" onclick="return false;" hidefocus=""></a>

          css代碼如下

          圖片樣式css

          css3縮放動畫

          css3縮放動畫

          效果引用

          這個效果主要運用到了@keyframes的生成動畫,利用css3的scale對兩張圖片進行縮放、透明度的交叉,最終得到動畫的實現。

          一個基礎的css3教程希望能給剛入門的小伙伴們帶來幫助,快動手試試吧!


          主站蜘蛛池模板: 久久久精品人妻一区亚美研究所| 日韩一区在线视频| 合区精品久久久中文字幕一区| 日韩一区二区三区精品| 一区二区三区在线观看视频| 国产成人无码精品一区在线观看 | 国产精品一区二区久久国产| 国产福利精品一区二区| 一区二区视频在线| 成人无号精品一区二区三区| 无码国产亚洲日韩国精品视频一区二区三区| 午夜精品一区二区三区在线视| 国产成人精品无码一区二区三区 | 人妻少妇精品视频一区二区三区| 交换国产精品视频一区| 精品亚洲福利一区二区| 中文字幕一区在线| 无码人妻精品一区二区三区东京热| 伊人久久一区二区三区无码| 日本韩国黄色一区二区三区| 国产免费一区二区三区不卡 | 国产一区二区三区免费看| 成人午夜视频精品一区| 91香蕉福利一区二区三区| 国产精品第一区揄拍无码| 在线观看免费视频一区| 国产吧一区在线视频| 无码精品蜜桃一区二区三区WW| 亚洲AV色香蕉一区二区| 韩国福利视频一区二区| 亚洲一区二区三区在线观看精品中文| 精品乱码一区二区三区四区| 无码欧精品亚洲日韩一区夜夜嗨 | 99久久精品费精品国产一区二区| 精品一区二区三区波多野结衣| 国产精品熟女视频一区二区| 国产精品特级毛片一区二区三区| 怡红院AV一区二区三区| 麻豆精品久久久一区二区| 欧洲精品码一区二区三区| 亚洲国产精品乱码一区二区|