馬里奧

編程沒有什麼不好


  • 首頁

  • 標籤

  • 分類

  • 歸檔

Docker 邊做邊學 (2) 製作鏡像 centos + nginx

發表於 2018-06-08 | 分類於 Docker |
  1. 創建並命名mynginx
1
docker run --name mynginx -it centos

容器內操作,安裝nginx

1
2
3
4
[root@5de85a72b2c0 /]# rpm -ivh http://mirrors.aliyun.com/epel/
[root@5de85a72b2c0 /]# epel-release-latest-7.noarch.rpm
[root@5de85a72b2c0 /]# yum install -y nginx
[root@5de85a72b2c0 /]# exit
  1. 查看mynginx的ID
1
2
3
4
5
docker ps -a

輸出:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5de85a72b2c0 centos "/bin/bash" 3 minutes ago Exited (0) About a minute ago mynginx

看到容器ID是5de85a72b2c0

  1. 第一次製作鏡像

使用commit命令將容器製作為鏡像

1
docker commit -m “mynginx” 5de85a72b2c0 noyung/mynginx:v1

運行完畢後,查看當前所有鏡像

1
docker images

這時候已經多出了一個新的鏡像

  1. 第二次製作鏡像

為剛才剛才建立好的鏡像加入一點內容

啟動新的容器

1
docker run -it --name nginxv1 noyung/mynginx:v1

在容器內,修改nginx.conf文件

1
[root@00f79adf417e /]# vi /etc/nginx/nginx.conf

加入 daemon off; 後離開exit

再次製作鏡像

1
docker commit -m “mynginx” dd99178fb0fb noyung/mynginx:v2

啟動 V2 images

1
docker run -d -p 82:80 noyung/mynginx:v2 nginx

小總結
Docker可以根據自己需要的環境,慢慢打上服務配置製作鏡像,但是這樣的方式效率不太好,上面的步驟可以透過dockerfile搞定。

瀏覽器自動化(3) Selenium 使用OCR 簡易破解驗證碼

發表於 2018-06-08 | 分類於 Selenium |
  1. Tesseract OCR

tesseract 是 Google/HP 的一個開源項目,支持多系統,有預設引擎可以辨識,也可以自己訓練學習庫。

  • 安裝

windows 安裝檔 下載地址

安裝後,須將OCR安裝路徑加入到環境變數,才能透過command辨識圖片文字。

  • 使用方法

確認command可以調用tesseract

1
tesseract

  1. Python Module pytesseract

python直接調用本地tesseract ocr的模塊。

  • 安裝
1
2
pip install pytesseract
pip install pillow # 還需安裝讀寫圖檔的模塊
  • 使用方法
1
2
3
4
5
from PIL import Image
import pytesseract

i = Image.open(filename)
pytesseract.image_to_string(i)
  1. Selenium

控制瀏覽器模擬輸入帳戶信息,透過ocr輸入驗證碼。

啟動

機電在線 註冊頁面

以機電在線註冊頁面的驗證碼來測試tesseract的辨識效果如何。

先寫幾個函數

  • 依照元素大小截圖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 依照元素大小截圖
def crop_screenshot(fullfile, cropfile, element):
browser.save_screenshot(fullfile)
if element:
type = element["type"]
name = element["name"]

imgelement = browser.find_element_by_xpath(".//*[@%s=%r]" % (type, name))
location = imgelement.location
size = imgelement.size
rangle = (int(location['x']), int(location['y']), int(
location['x'] + size['width']), int(location['y'] + size['height']))

i = Image.open(fullfile)
fincrop = i.crop(rangle)
fincrop.save(cropfile)
else:
pass

定位元素座標後,在以屏幕截圖的方式。切出只有驗證碼的圖片。

  • OCR辨識圖片文字
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
def ImgToOcr(filename):

i = Image.open(filename)

i = i.resize((90, 32), Image.ANTIALIAS) # 調整圖片大小

Lim = i.convert('L') # 詼諧

# 降噪
threshold = 80
table = []
for i in range(256):
if i < threshold:
table.append(0)
else:
table.append(1)

Lim = Lim.point(table, '1')

# OCR
OCR_text = pytesseract.image_to_string(Lim)

if len(OCR_text) == 4:
Lim.save("./ocr/%s.png" % OCR_text)

return OCR_text

原先的圖片太小,無法得到好的辨識效果,試著先將大小調整為(90, 32),並做詼諧
、二值化,並以辨識文字做為檔名儲存,最後測試辨識20張圖片,效果為何。

測試效果發現辨識率挺不錯的,只有少數幾張的失敗。

小結

預設的辭庫真的挺強大的,只要字體還算清楚,沒有雜點都能準確的辨識。當然,遇到的驗證碼沒有這麼順利的話,還是可以自己訓練的,只是步驟相當繁瑣,如果只是要登入的話,可以使用Cookie登入獲取資料,相對會容易些。

幾個練習破解驗證碼的網站

  1. 中山大學 選課系統
  2. 交通大學
  3. 機電在線

Docker 邊做邊學 (1) 搭建nginx服務器

發表於 2018-06-08 | 分類於 Docker |
  1. 到倉庫下載nginx最新鏡像
1
docker pull nginx:latest
  1. 查看目前所有鏡像
1
docker images

輸出:

  1. 前台運行
1
docker run nginx
  1. 後台運行

背景運行 不卡終端

1
docker run -d nginx
  1. 網路端口映射

指定本機80/tcp對應容器內80/tcp

若不指定映射端口使用-P

1
docker run -p 80:80 nginx
  1. 本機查看80/tcp是否開啟
1
2
3
netstat -na | grep 8080
輸出:
tcp6 0 0 :::8080 :::* LISTEN
  1. 查看80端口可否訪問

  1. 查看目前運行的容器
1
docker ps

進入目前運行的容器 54dbd519a8be

1
docker exec -it 54 bash

容器內

1
2
3
4
root@54dbd519a8be:/#
#查一下nginx
root@54dbd519a8be:/# which nginx
/usr/sbin/nginx

  1. 停止運行 容器

容器ID:54dbd519a8be
停止可以直接輸入開頭的5

1
docker stop 5
  1. 運行並命名容器

運行image並進入容器

1
2
3
4
5
6
7
8
# 給它命名,並運行完會進入容器
docker run --name mydocker -t -i centos /bin/bash

# 查看一些進入的信息
[root@8b07b1e213d4 /]# ps aux

# 離開容器
[root@8b07b1e213d4 /]# exit

透過 docker ps -a (查到剛剛那個容器顯示離開)

1
$ docker ps -a

  1. 再次啟動容器 docker start CONTAINER
1
$ docker start 8b07b1e213d4

進入容器

1
$ docker exec -it 8b07b1e213d4 bash

離開容器

1
root@8b07b1e213d4:/# exit

Zabbix學習筆記(2) 創建監控項 - 簡單檢查

發表於 2018-06-08 | 分類於 Zabbix |

利用簡單檢查監測站點是否存活,Zabbix內置的簡單檢查可針對各端口站點監測是否有回應?速度如何?

1. 創建一個主機

這個步驟是非必要的,這邊操作的目的在於避免與Agent端混淆。

創建主機

填寫主機內容

主機名稱:PingHost(也可以隨意命名)
群組一定要選一個,這邊選擇Discovered hosts(發現的主機)

創建成功

2. 創建監控項

選擇剛剛建好的主機,並創建監控項

簡單檢查 Simple Check

類型選擇”簡單檢查”

在鍵值空白旁點擊”選擇”

什麼是簡單檢查?

簡單來說提供了三種監測服務,分別為Ping、TCP、UDP,Ping可以查看主機是否存活、丟包、超時等,TCP功能支持多種服務類型如:ssh, ldap, smtp, ftp, http, pop, nntp, imap, tcp, https, telnet,也可任意指定端口,主要查看是否可以連接、超時等,UDP功能與TCP接近,更多及相關參數可以參考官方文檔。

選擇簡體中文可以得到較好的支持,試過選擇繁中這個頁面中文化不是很完全,比較偏好中文的朋友可選簡中試試。

3. 填寫監測內容

監測Modem(IP:192.168.0.1)是否正常。

類型:簡單檢查
鍵值:icmppingsec[192.168.0.1]
信息類型:浮點數
單位:s

若選擇的鍵值是有返回響應時間,那信息類型就需要選擇浮點數,單位輸入s。

填寫內容

對應填寫內容如下,填寫完畢後要在頁面最下方點擊添加。

填寫完畢

4. 查看在監測的項目

最新數據

選擇監測中點擊”最新數據”

找出監控項

篩選群組或主機找出監控項,查看是否已有數據。

查看圖形

點擊圖形查看分時圖。

瀏覽器自動化(2) 同時調用Selenium2與Selenium3

發表於 2018-06-08 | 分類於 Selenium |

虛擬還境可將python的模塊依賴分開管理,能使用指定版本或避免衝突問題。

Selenium2

使用技巧:

  1. firefox 不須透過webdriver。
  2. 默認支持全屏幕截圖。

如何調用

  1. 建立虛擬環境 Selenium2 VEnv

    安裝指定版本

    1
    pip install selenium==2.53.2
  2. 下載免安裝的firefox46.01

FirefoxPortable 46 下載地址

使用腳本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date : 2018-05-16 08:33:47
# @Author : Maliao
# @Link : None

from selenium import webdriver
from PIL import Image
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
from selenium.webdriver.firefox.firefox_profile import FirefoxProfile
from time import sleep

binary = FirefoxBinary(r".\FirefoxPortable\FirefoxPortable.exe") # firefox 主程序 檔案
profile = FirefoxProfile(r'.\FirefoxPortable\Data\profile') # firefox 使用者設定檔

browser = webdriver.Firefox(firefox_binary=binary, firefox_profile=profile)
browser.set_window_size(800, 900) # 指定窗口大小


# 依照元素大小截圖
def crop_screenshot(fullfile, cropfile, element):
browser.save_screenshot(fullfile)
if element:
type = element["type"]
name = element["name"]

imgelement = browser.find_element_by_xpath(".//*[@%s=%r]" % (type, name))
location = imgelement.location
size = imgelement.size
rangle = (int(location['x']), int(location['y']), int(
location['x'] + size['width']), int(location['y'] + size['height']))

i = Image.open(fullfile)
fincrop = i.crop(rangle)
fincrop.save(cropfile)
else:
pass

# 滾動窗口 加載所有圖片
def js_scroll_down(text):
jsdown = '''
(function () {
var y = 0;
var step = 100;
window.scroll(0, 0);

function f() {
if (y < document.body.scrollHeight) {
y += step;
window.scroll(0, y);
setTimeout(f, 100);
} else {
window.scroll(0, 0);
document.title += "%s";
}
}

setTimeout(f, 1000);
})();
''' % text

browser.execute_script(jsdown)


browser.get("https://www.ithome.com/html/android/360003.htm")

# 調用JS 下拉加載所有圖片
text = "SD"
js_scroll_down(text)
changetitle = "%s%s" % (browser.title, text)
while 1: # 死循環 等待js跑完
nowtitle = browser.title
if changetitle in nowtitle:
break
else:
sleep(1)


# 儲存 指定元素截圖
element = {"type": "class", "name": "post_content"}
cropfile = r"./data/ithome%s.png" % browser.current_url.split("/")[-1].split(".")[0]
fullfile = r"./data/ithomeCN.png"
crop_screenshot(fullfile=fullfile, cropfile=cropfile, element=element)

# 關閉瀏覽器
browser.quit()

截出一整張的長截圖。

selenium3

使用技巧:

  1. 支持最新版瀏覽器。
  2. 需使用webdriver驅動。

如何調用

  1. 建立虛擬環境 Selenium3 VEnv

    安裝最新版本

    1
    pip install selenium
  2. 下載Chrome

  3. 下載Chome Driver

使用腳本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date : 2018-05-16 08:33:47
# @Author : Maliao
# @Link : None


from selenium import webdriver
from selenium.webdriver.common.keys import Keys

browser = webdriver.Chrome() # 調用webdriver

browser.get("http://www.google.com")

browser.find_element_by_id("lst-ib").send_keys("python") # 搜索框輸入:"python"

browser.find_element_by_name("btnK").send_keys(Keys.ENTER) # 提交搜尋

titles = browser.find_elements_by_xpath(".//h3[@class='r']//a") # 搜尋所有標題

print([i.text for i in titles]) # 打印所有標題

browser.quit() # 離開瀏覽器

# 輸出:
['Welcome to Python.org', 'Python教程- 廖雪峰的官方网站', 'Python - 维基百科,自由的百科全书', 'Python 简介| 菜鸟教程', '教程一览| 莫烦Python', 'Python For Loops - W3Schools', 'Python Tutorial - W3Schools', 'Python - Attorneys at law – Geneva Switzerland Tokyo Brussels', 'Python Functions | DataCamp', '用Python 理財:打造小資族選股策略- Hahow 好學校']

小結:

操作上Chrome快速很多,而firefox雖然啟動比較慢,但不用webdriver及全屏截圖,實在相當便利。

Jenkins學習(2) 新增節點

發表於 2018-06-08 | 分類於 Jenkins |

Jenkins服務器不只可以用於服務器本機的構建,還可以將其他台電腦作為Jenkins Agent(節點)進行控制。

新增節點

這邊介紹新增節點的兩種方式:

  • Launch slave agents via SSH

    用於控制Linux系統主機

  • 通过Java Web启动代理 (需另外開啟)

    用於控制Windows系統主機

Liunx

這邊的環境是Ubuntu系統

Ubuntu IP: 192.168.8.32
User: mario
passwd: **

  1. 進入新增節點頁面

    http://<jenkins_url>/computer

  2. 新增節點

    依序點選輸入即可

  3. 設置節點信息

  • 開發構建數

    最多執行的項目數,超過就等待構建

  • 遠程工作目錄(必填)

    如果在項目中沒有切換目錄,默認是以這個位置作為工作目錄。

  • 標籤

    當有多個節點時,可用標籤指定哪個節點執行。

  • 用法

    尽可能的使用这个节点

    若不指定節點,將會找目前空閒的主機進行構建

    只允许运行绑定到这台机器的Job

    只支持有指定標籤的項目進行構建

  • 啟動方式(必填)

    先選擇Launch agent via execution of command on the master,在選點擊”ADD”按鈕加入節點主機信息。

  1. 成功新增節點

Windows

Windows系統在連接Jenkins服務器之前,需先開啟TCP port for JNLP agents端口讓Windows系統用戶連接。

  1. 開啟端口

    進入全局安全配置頁面,找到代理選擇指定端口

    因為我是用Docker建置,在建置時有額外開出50005端口,所以這邊選擇指定端口,若是自己搭建的Jenkins選擇隨機獲取也是可以的。

  2. 新增節點

    增加代理端口後,在新增節點就會多一個通过Java Web启动代理,Windows系統用戶就這個來加入節點。

  3. 節點狀態 - 未在線

    節點是新增了,但是顯示X(未在線)

    由於通过Java Web启动代理並不能像SSH連接電腦節點,因此還需要手動在Agent進行連接

  1. agent 連接 Jenkins

    頁面提示的兩個方法都可以連接,這邊使用第一個方法Launch agent from browser

    • 點擊Launch 下載slave-agent.jnlp

    • 執行slave-agent.jnlp

      這個檔案可以直接運行,如果遇到問題,可以先嘗試安裝或更新Java版本。

    • 成功連接

    • 狀態正常

錯誤筆記

Linux連接節點失敗

1
2
3
4
5
Linux Wonderful 4.4.0-104-generic #127-Ubuntu SMP Mon Dec 11 12:16:42 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
Installing JDK jdk-8u144-oth-JPR
Downloading JDK from http://download.oracle.com/otn/java/jdk/8u144-b01/090f390dda5b47b9b721c7dfaa008135/jdk-8u144-linux-x64.tar.gz
Oracle now requires Oracle account to download previous versions of JDK. Please specify your Oracle account username/password.
java.io.IOException: Could not find any known supported java version in [java, /usr/bin/java, /usr/java/default/bin/java, /usr/java/latest/bin/java, /usr/local/bin/java, /usr/local/java/bin/java, /home/mario/workspace/jdk/bin/java], and we also failed to install JDK as a fallback

要安裝java

1
2
3
sudo apt-get update
sudo apt-get install -y default-jre
sudo apt-get install -y default-jdk

安裝後連接正常

小結

Windows作業在連接上比較麻煩,而Linux可以直接透過SSH連接上非常方便。

Zabbix學習筆記(1) 用Docker建置Zabbix Server

發表於 2018-06-08 | 分類於 Zabbix |

在建置官方提供的zabbix-xxl之前,可以先將已知的”圖形中文亂碼”問題,把中文字型檔及設定檔準備好,在建置時直接對應映射即可,這樣就不用進容器再改一次.

容器內路經

zabbix 字型路經:/usr/local/src/zabbix/frontends/php/fonts/
前端PHP配置檔路經:/usr/local/src/zabbix/frontends/php/include/defines.inc.php

zabbix預設是沒有中文字型的,因此基本的字型檔會造成圖形文字呈現方格或是亂碼。

解決方法只要將中文字型檔放入/usr/local/src/zabbix/frontends/php/fonts/,並在/usr/local/src/zabbix/frontends/php/include/defines.inc.php中更改配置就可以了。

因為每次構建都有相同問題,所以我直接放在Github方便日後需要時可以直接構建。

docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
version: '2'
services:
zabbix-db:
image: monitoringartist/zabbix-db-mariadb
volumes:
- ./zabbix/zabbix-db-storage:/var/lib/mysql
- ./zabbix/backups:/backups
- /etc/localtime:/etc/localtime:ro
environment:
- MARIADB_USER=zabbix
- MARIADB_PASS=admin
zabbix-server:
image: monitoringartist/zabbix-xxl:latest
depends_on:
- zabbix-db
ports:
- "80:80"
- "10051:10051"
volumes:
- /etc/localtime:/etc/localtime:ro
- ./zabbix/temp:/usr/local/src/zabbix/temp
- ./zabbix/conf/fonts/:/usr/local/src/zabbix/frontends/php/fonts/
- ./zabbix/conf/defines.inc.php:/usr/local/src/zabbix/frontends/php/include/defines.inc.php
links:
- zabbix-db:zabbix.db
environment:
- ZS_DBHost=zabbix.db
- ZS_DBUser=zabbix
- ZS_DBPassword=admin
volumes:
zabbix-db-storage:
driver: local
backups:
driver: local

源碼地址

Docker 學習筆記

發表於 2018-06-08 | 分類於 Docker |

Dcoekr是什麼

Docker 組成:

  • Docker client
  • Docker server

Docker 組件

  • 鏡像 (image)

    普遍鏡像依賴於Linux內核在封裝服務所提供的,稱為鏡像。

  • 容器 (container)

    以鏡像建立成應用或服務的,稱為容器。

  • 倉庫 (repository)

    倉庫是存放鏡像檔案的地方,分為公開倉庫及私有倉庫。公開倉庫如https://hub.docker.com/,私有倉庫則可自行搭建。

Docker Container VS 虛擬機

少了客體作業系統(Guest OS)這一層,更接近原生也更輕量。

Docker使用場景

  • 使用Docker容器開發、測試、部署服務
  • 創建隔離的運行環境
  • 搭建測試環境

Docker 安裝

Ubuntu系統安裝Docker方法非常簡單,可以直接參考以下網址的教學。

Ubuntu 16.04 安装

(記得:注销当前用户,重新登陆)

Docker 基本使用

查看Docker版本

1
docker -v

拉取鏡像

1
docker pull IMAGE

啟動容器

如果鏡像不存在,會自動拉取鏡像

1
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

Options:

1
2
3
4
5
6
-d 後台運行
-p 指定端口映射 (ex:80:80)
-P 隨機端口映射
-it 啟動並進入容器
—rm 退出後自動刪除
--name 自定義容器名

更多Dockcer Run

查看已建立的容器

1
docker ps [OPTIONS]

Options:

1
2
-a 顯示所有容器(默認只有顯示正在運行的容器)
-l 顯示最新建立的容器

更多Dockcer Ps

刪除容器

1
docker kill [OPTIONS] CONTAINER [CONTAINER...]

顯示所有鏡像

1
docker images [OPTIONS] [REPOSITORY[:TAG]]

查看日誌

1
docker logs [OPTIONS] CONTAINER

Options:

1
2
-f 實時更新
-t 顯示時間

更多docker logs

運行所有容器

1
docker start $(docker ps -a -q)

停止所有容器

1
docker stop $(docker ps -a -q)

殺死所有正在運行的容器

1
docker kill $(docker ps -a -q)

刪除所有鏡像

1
docker rmi $(docker images -q)

進入容器

1
2
docker exec CONTAINER
docker attach CONTAINER

瀏覽器自動化(1) 建置Python3+Selenium測試環境

發表於 2018-06-08 | 分類於 Selenium |

python要使用selenium可以直接安裝依賴模塊selenium進行操作,需要注意的是selenium操作瀏覽器是有版本支援問題的,以下為簡要說明:

Slenium2 可直接操作firefox46以下,並可直接調用不須另外使用webdriver驅動,最好用的是原生支持全屏截圖。其他瀏覽器不能直接調用,需要使用webdriver驅動。

Slenium3 基本都需要webdriver驅動,並且還需留意瀏覽器與webdriver版本問題,如下:

Chrome
ChromeDriver地址
Chrome browser歷史版本(各系統)

下載地址會說明支持對應版本
Chrome 65-67 使用 ChromeDriver 2.38
Chrome 63-65 使用 chromedriver 2.36
Chrome 62-64 使用 chromedriver 2.35
Chrome > 41, 使用 chromedriver 2.15

Firefox

geckodriver
Firefox 歷史版本 阿榮免安裝
Firefox 歷史版本

留意selenum版本對應問題
Firefox < 46.1, 使用 Selenium 2.53.1
FirefoxPortable 46
Firefox >= 47, 使用 Selenium 3.0.1 需加上geckodriver

Opera

operachromiumdriver
Opera browser歷史版本(各系統)

下載地址會說明支持對應版本
Opera 53 使用 operachromiumdriver 2.36
Opera 52 使用 operachromiumdriver 2.35

環境

  1. python selenium

    1
    pip install selenium
  2. browser

    以Opera為例:

    • 52.0.2871.64 下載地址
  3. webdriver

    操作瀏覽器之前,必須先有webdriver

    opera chromium driver

    我安裝的opera52版的瀏覽器,webdriver也要找對應支持的。

    如何安裝:

    1. 下載對應webdriver
    2. 將下載好的webdriver加到環境變數中

當然,可以將會用到的webdriver都放在c:\webdriver中。

在將c:\webdriver整個資料夾加到環境變量中,如果有更新webdriver的需求也比較好整理。

啟動

selenium2、3調用上並沒有太大區別。

一般創建實例

看到browser成功啟動,就說明webdriver成功驅動browser。

1
2
3
4
from selenium import webdriver

Firefox = webdriver.Firefox()
Chrome = webdriver.Chrome()

使用者插件

selenium也可以直接調用包含使用者紀錄或插件(如:檔廣告)的browser。

  • Firefox
1
2
3
4
5
6
7
from selenium import webdriver

url = "https://mail.google.com"
fp = webdriver.FirefoxProfile('/Users/<username>/Library/Application Support/Firefox/Profiles/71v1uczn.default')

driver = webdriver.Firefox(fp)
driver.get(url)
  • Remote Firefox

如使用selenium server可以參考

1
2
3
4
5
6
7
8
9
10
11
12
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.firefox.firefox_profile import FirefoxProfile
import time

# 本機firefox設定檔路經
profile = FirefoxProfile('/home/user/.mozilla/firefox/089njn4b.default')

browser = webdriver.Remote(
command_executor='http://127.0.0.1:4446/wd/hub',
desired_capabilities=DesiredCapabilities.FIREFOX,
browser_profile=profile)
  • Chrome
1
2
3
4
5
6
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = webdriver.ChromeOptions()
options.add_argument("user-data-dir=C:\\Path") #Path to your chrome profile
w = webdriver.Chrome(executable_path="C:\\Users\\chromedriver.exe", chrome_options=options)

指定webdriver路徑

webdriver不希望加入環境變量,也可以直接指定路徑調用。

1
2
3
from selenium import webdriver
path = "/opt/webdriver/chromedriver.exe"
Chrome = webdriver.Chrome(path)

指定chrome主程序目錄

  • Firefox
1
2
3
4
5
6
from selenium import webdriver

from selenium.webdriver.firefox.firefox_binary import FirefoxBinary

binary = FirefoxBinary("C:\Users\LENOVO\FirefoxPortable.exe")
driver = webdriver.Firefox(firefox_binary=binary)
  • Chrome
1
2
3
4
5
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
opts = Options()
opts.binary_location = chromium_path
driver = webdriver.Chrome(chrome_options=opts)

使用

進入資策會網站,搜索後離開網頁。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date : 2018-05-16 08:33:47
# @Author : Maliao
# @Link : None


from selenium import webdriver

browser = webdriver.Chrome() # 調用webdriver

browser.get("https://w3.iiiedu.org.tw/") # 訪問 資策會網站

browser.find_element_by_id("LongTerm").click() # 點擊ID "LongTerm" 專長養成班

browser.find_element_by_id("searchInput").send_keys("python") # 搜索框輸入:"python"

browser.find_element_by_id("searchBtn").click() # 提交搜尋

browser.save_screenshot("iiiedu.png") # 螢幕截圖

browser.quit() # 離開瀏覽器

Pocket API + Python 學習筆記

發表於 2018-06-08 | 分類於 Python |

原先我只了解evernote可以離線閱讀文章,但evernote對於多裝置實在是不方便。

直到有天,我在知乎看到大神都是怎麼收藏好文章的。

知乎好文 - 你是怎么使用 Pocket (Read it Later)、Instapaper、Readability 和 Evernote 的?

於是我開始使用了Pocket。慢慢的先從Chrome的擴充功能每個URL保存到Pocket,然後手機應用也同步了,用到後來我希望將imgur及自己經常訂閱Rss也能同步到Pocket。

因此看了Pocket API認為可行,以下是自己使用Pocket API加上Python的過程。

Pocket API官方文檔

申請Pocket API

下面我使用postman工具操作Post請求

建立pocket app 取得CONSUMER KEY

先到這個創建網址,建立一個新的APP,輸入名稱,並如下圖勾選創建

創建網址:https://getpocket.com/developer/apps/new

完成後會得到”CONSUMER KEY”

我的CONSUMER KEY為74297-3a202d306550d2de94dce8b3

oauth 取得code

根據官網提示需要用POST請求提交取得code

請求網址:https://getpocket.com/v3/oauth/request

  • 說明
1
2
consumer_key=<consumer_key>
redirect_uri=<app_name>:authorizationFinished
  • 請求取得code

我的資訊
consumer_key=74297-3a202d306550d2de94dce8b3
redirect_uri=MarioPocket3:authorizationFinished

在POST請求之後會得到code

1
code=a916cd07-8306-86ea-b213-1f6af0

激活授權

將一些驗證到的訊息,輸入到網址中取得授權

  • 網址說明
1
https://getpocket.com/auth/authorize?request_token=<上一步取得的code>&redirect_uri=<app_name>:authorizationFinished
  • 取得授權

https://getpocket.com/auth/authorize?request_token=a916cd07-8306-86ea-b213-1f6af0&redirect_uri=MarioPocket3:authorizationFinished

取得access_token

根據官網提示需要用POST請求提交取得access_token
請求網址:https://getpocket.com/v3/oauth/authorize

將資訊內容提交請求

consumer_key=74297-3a202d306550d2de94dce8b3
code=a916cd07-8306-86ea-b213-1f6af0

得到access_token

1
access_token=cc2b9561-999a-1261-d58e-63c3d2&username=noyoung.guo%40gmail.com

能夠正常取得access_token就算是完成了,接下來試著新增URL看看…

正式使用Pocket API

利用Pocket API 新增URL

Pocket API add文檔

Method URL:https://getpocket.com/v3/add

1
2
3
url=https://getpocket.com/developer/docs/v3/add
consumer_key=74297-3a202d306550d2de94dce8b3
access_token=cc2b9561-999a-1261-d58e-63c3d2&username=noyoung.guo%40gmail.com

成功!!

測試新增沒問題,開始使用python看看。

Python 調用 Pocket API

環境

1
2
python 3.6.2
requests

新增

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import requests


def add(url, tags=None):
payload = {'consumer_key': '74312-5815e4d014e7e0e046c7cc85',
'access_token': '7acb01d7-f791-5e24-c663-632499',
'url': url,
'tags': tags}
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
r = requests.post('https://getpocket.com/v3/add', data=payload, headers=headers)
print(r.json()['item']['title'])

# 測試加入一個文章urlhttps://finance.technews.tw/2018/01/23/lg-innotek-2017-q4/
add("https://finance.technews.tw/2018/01/23/lg-innotek-2017-q4/",tags="ITnews")

剛剛新增的已經加進來囉

參考

  • Python で Pocket の API を叩く方法
  • pocket API 学习笔记
1…345

Maliao Guo

41 文章
8 分類
18 標籤
GitHub
© 2018 Maliao Guo
由 Hexo 強力驅動
|
主題 — NexT.Pisces v5.1.4