# Intro 又是久違的寫爬蟲…
這次是接手大大們的 code
寫的是 PHP 版本
研究了一下寫法
才發現現在可以不使用第三方套件就可以處理了
所以這裡紀錄一下
# 取得 HTML 內容 使用 curl 使用 file_get_contents curl 是我常用的方式 看了大大們的 code 才知道原來 file_get_contents 也可以取 http/https 內容…
這邊簡單貼一下兩種作法的範例
## curl function httpGet($url) { $ch = curl_init(); curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_RETURNTRANSFER,true); curl_setopt($ch,CURLOPT_HEADER, [ 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36' ]); $output=curl_exec($ch); curl_close($ch); return $output; } ## file_get_contents function htmlContentGet($url) { $opts = [ "http" => [ "method" => "GET", "header" => "User-Agent: Mozilla/5.
...
Category: PHP
# 最近剛好遇到個問題就順便筆記一下(但是遇到的問題和要寫的內文無關就是了 XD) # 前言 基本上在 url query string 的 value 都要做 url encode
URL encode 會用到以下標準
RFC 1738
RFC 2396
RFC 3986
主要會使用 % 字符來針對需要 escape 的字元做編碼
ex: / -> %2F, + -> %2B 等
但是主要又有幾個問題是基於 HTTP GET 和 POST 與 application/x-www-form-urlencoded 的問題
基本上在使用 HTML form 表單使用時
採用的會是把 空格轉成 +
但這些都不算是大問題
因為基於 CGI 和程式語言的實作
會把 urldeode 回來
所以在程式語言接到 query string 時都是 urldecode 回來的值
問題是在於 browser 上發出到 server 的 URL(就是打開 server 的 access log 看到進來的 Path 拉)
...
一直以來大部分時間都在用 PHP 開發
所以也用 PHP 來處理 HTML Form
所以都下意識地認為 <input type="checkbox" name="game[]" value="FGO">
這樣的 name="game[]" 的處理方式是正規的處理 HTML Form 的多選的方式
也疑惑為何大多的 HTML Form 的教學甚至 MDN 都沒有提到這件事
就在某一天我在檢視到同事寫的 code 時
發現同事用 JavaScript 處理
硬爬出來自己組字串送出去
我才想起這令人感到恐懼的事情
因為公司同事是寫 golang 的專門, 就算前端不熟
應該也不至於連這樣概念都沒有就用硬爬的方式處理
所以再調整的同時也跟同事確認後
我也真正的直視這問題
到底要怎麼處理表單中多選的資料?
PHP 寫久的人大多都知道要用上面列出的方法
name="game[]"
就是 game + []
但是當我認真地尋找關於這個問題時
意外地發現了一篇 stackoverflow 的問答
Several Checkboxes sharing the same name
其實 W3C 根本沒有管你 name="" 重複要如何處理
以下是 PHP, nodejs, golang 的原生方式來測試的結果
# PHP 以下問答有提供了 PHP doc 說明 PHP 如何處理多選
...
# 需求 讀取一段文字後
可以決定字型
最後要轉成圖片
# 使用的工具 php7.2
freetype
提前說明需要用到 GD(這通常預設就啟動了)
freetype 通常會需要另外安裝
如何先檢查有沒有 GD 和 freetype
先用 phpinfo 檢查即可
-> % php -a Interactive shell php > 之後再打
echo phpinfo(); 就會 output 資訊了
在搜尋 gd
gd GD Support => enabled GD Version => bundled (2.1.0 compatible) GIF Read Support => enabled GIF Create Support => enabled JPEG Support => enabled libJPEG Version => 9 compatible PNG Support => enabled libPNG Version => 1.
...
PHP - check HTTP protocol
Use
$protocol = (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1) || isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') ? 'https' : 'http';
...
# php - float 浮點數科學記號轉換 php - float
php 的浮點數大小受限於系統, 且會自動轉換成科學記號呈現, 但是一般人不會去看科學記號
echo 0.0000234; // 2.34E-5 在呈現上希望轉換回小數點的呈現
可以用以下方法做到
$s = 0.0000234; trim(rtrim(sprintf("%.10f", $s), '0'), '.'); // 0.0000234 這邊 sprintf 只取 10 位數
因為就之前遇到的系統超過 10 位數都會是不精確的浮點數
...
# Mac - php redis install ## Mac Env Mac OSX 10.14.5
## Step git clone https://www.github.com/phpredis/phpredis.git cd phpredis phpize && ./configure && make && sudo make install test
php -r "if (new Redis() == true){ echo \"\r\n OK \r\n\"; }" ## Troubleshooting ### phpize 1.
$ phpize grep: /usr/include/php/main/php.h: No such file or directory grep: /usr/include/php/Zend/zend_modules.h: No such file or directory grep: /usr/include/php/Zend/zend_extensions.h: No such file or directory Configuring for: PHP Api Version: Zend Module Api No: Zend Extension Api No: Solution
...
# php - loop directory Sometime need use php loop directory list all file in this directory
$directory = scandir('./js'); foreach($directory as $file) { if ($file === '.' || $file === '..') { continue; } echo $file; echo "\n"; }
...
# php - 比對時間 記錄一下比對時間的方式(利用 timestamp)
time() > strtotime('2017-11-13 23:59:59');
...
# Something about XSS(Cross-site scripting) If not set anything
Use like
<?php echo $_GET['name'];?> and querystring name = <script>alert(document.cookie)</script>
And not defence XSS
In Firefox
In Chrome
In Safari
## Result Chrome & Safari browser has handle XSS default
## Defence Set header X-XSS-Protection: 1
if use PHP, can use
htmlspecialchars() // or htmlentities() ## Important! Finally
We must know it is handle encode to avoid run JavaScript on page
...