網站 / LINE Notify 推播

透過這個網站LINE Notify 推播

練習了 PHP程式語法  WordPress Hooks的Actions Filters 還有POSTMAN的使用

 

寫在前面1

原本是想到用現有的WP外掛

但是有些想要的功能無法達成

例如傳出分段落的訊息,這個涉及到外掛傳送參數的方式

如果直接用程式傳送的話,可以傳出分行符號\n

還有可以將訊息用陣列資料的格式傳出

結果,到後來變成用自訂外掛的方式來處理…

寫在前面2

如果外掛程式內容有錯,不是邏輯、或者變數、或者函式的錯誤,

單純是語法結構上的錯誤,例如:大、小括號 { } ( )沒有完整對應,少了分號 ; 

這樣就會讓整個系統掛掉

因為不是用測試用的網站,沒辦法直接改本機的檔案

我也搞不懂GCP的權限,雖然可以在FTP,或者是 Notepad++(FTP外掛)

透過SSH方式,連上遠端主機,也能看到檔案,但是就無法更改特定資料夾的檔案

研究這個主題可能又要花很多時間,包含了伺服器的檔案管理跟權限設定,還有90%以上內容是英文的GCP參考資料

實在超過我的能力有100萬光年

因此,用最直接的方式,在GCP透過虛擬機器的SSH連到伺服器進行處理

一開始還是有權限的問題,修改檔案後無法存檔,而且這種文字處理介面實在太苦手

要再細究的話,可能又要花很多時間

還好,可以刪掉檔案..

基於安全因素,刪除資料夾之前要先刪除檔案

總之,把測試的外掛資料夾跟檔案刪除之後,系統就會恢復正常

只要知道以下的基礎指令就可以

sudo:使用最高權限(superuser)執行指令

cd:change directory,移動進入資料夾

rm:remove file,刪除檔案

rmdir:remove dir,移除目錄

回到主題

要讓WordPress網站推播LINE Notify訊息

首先要在Line設定連動的服務

LINE Notify還有一個類似功能是管理服務

我其實不懂這兩者實際上的差別

看說明,管理服務會發出token檢查,可以讓其他人主動訂閱等等

感覺功能性比較好,可以在網站或者連結設定訂閱的連結

而連動服務比較簡單,只要將LINE Notify連動服務綁訂特定群組,並且將LINE Notify加入群組就可以了

設定方法在網路上有很多教學

例如:[API連線測試]使用Postman測試LINE Notify的訊息推送

參考了網路上的做法,並且在GAP測試,這過程就花了好多時間

要注意的是GAP的語法是JavaScipt,而WordPress網站是PHP

於是先在POSTMAN進行測試

這裡參考了前面提到的:[API連線測試]使用Postman測試LINE Notify的訊息推送

原本是想測試WP外掛為什麼沒辦法傳輸陣列形式的參數

例如在GAP的程式的fetch( )可以用payload 來傳遞資料內容

payload = { ‘message’ : message,

                   ‘imageThumbnail’: pictureURL,

                    imageFullsize’: pictureURL }

其他程式語言也有類似的用法

例如:Python Requests post() Method的 data={key: value}

猜測是因為這個WP外掛,跟POSTMAN一樣會用陣列的方式去包覆參數

並且給予 key – value的對應

這樣傳出去的資料格式就不對了

後來也在GAP測試

這裡參考了以下教學

自建 LINE Notify 訊息通知

LINE Notify:用Google Apps Script,建立簡易網站監測機器人

 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
function SendMessageToLineNotify()
{
  var message = "中文測試\n~!@#$%^&*()123456789";
  var pictureURL= "https://i2.kknews.cc/SIG=1hsq8os/ctp-vzntr/r3sn77r39o364q46nps4n57pop734q35.jpg";
  sendMessage(message, pictureURL);
}

function sendMessage(message, pictureURL){
  var Token = "******************************************";      //個人  群組 ******************************************
  var URL = "https://notify-api.line.me/api/notify";

  var payload = 
      {
        'message' : message,
        'imageThumbnail': pictureURL,
        'imageFullsize': pictureURL
      };
  
  var header =
      {
        'Content-Type':'application/x-www-form-urlencoded',
        'Authorization' : 'Bearer ' + Token        
      }
  
  var options =
      {
        'method'  : 'post',
        'payload' : payload,
        'headers' : header
      }; 

  var response = UrlFetchApp.fetch(URL, options);
  Logger.log(response);
}

 


 

於是進一步,在網站中測試

原本是想用程式碼片段來加入程式碼

因為在《WordPress站長練功秘笈:網站客製化、佈景主題與外掛開發的16堂課》

書中有個篩選關鍵字的外掛,可以用程式碼片段的方式在網站中執行程式

所以,我一開始也是用這種方式來測試,結果程式都無法執行

後來想說會不會是不能這樣執行

於是改成外掛的方式,結果程式就能夠執行

以下的程式碼就是結合前面的內容:LINE Notify 推播 + WP自訂外掛

主要是想達成兩個效果

新增文章 跟 更新文章,能夠透過 LINE Notify 推播訊息

測試過很多 Hook Actions,但是效果都不盡理想

後來找到 transition_post_status才符合我的需求

備註一下:add_action( )的用法

add_action( string $tag, callable $function_to_add, int $priority = 10, int $accepted_args = 1 )

影響比較大的是

$accepted_args

(int) (Optional) The number of arguments the function accepts. Default value: 1

這邊是設定傳出的參數數量,預設是1,如果沒改的話

以 transition_post_status 為例,這樣只會傳出第1個參數:$new_status

其餘兩個參數$old_status, $post都不會傳出

一開始不知道,想說為什麼會出現錯誤訊息,說參數數量不對

後來在google大神的幫助之下才知道add_action的參數設定

再回來主題

透過這個Actions,兩個程式只有 if 判斷文章狀態的差異

新增文章是: 新的文章狀態是”發佈”,原來的文章狀態是未發佈

備註:因為已經發佈的文章,不會再發佈,只能更新

在這邊卡很久,因為一直受到測試其他Actions的影響

所以一直考慮文章的”自動草稿”,跟輸入內容後產生的”草稿”  這兩個情況要怎麼排除

但是後來在發現其實不需要用排除的方式,直接列出執行Actions的條件就可以了

 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
function publishOne($new_status, $old_status, $post){
	$postOne = get_post($post); 
	$posrUrl = get_permalink($post);
	$titleOne = $postOne->post_title;
	$author = $post->post_author; /* Post author ID. */
    $name = get_the_author_meta( 'nickname', $author );
	//判斷文章狀態
	if (  $new_status == 'publish' && $old_status !=='publish'  &&  $post->post_type == 'post') 
	{         
		$initData['message'] = $name."剛剛發佈".$titleOne."→".$posrUrl;
		//$initData['imageThumbnail'] = 'https://i2.kknews.cc/SIG=1hsq8os/ctp-vzntr/r3sn77r39o364q46nps4n57pop734q35.jpg';
		//$initData['imageFullsize'] = 'https://i2.kknews.cc/SIG=1hsq8os/ctp-vzntr/r3sn77r39o364q46nps4n57pop734q35.jpg';
		$initData['stickerPackageId'] = '1';
		$initData['stickerId'] = '114';  
		$token = '*******************************************';
		$url = 'https://notify-api.line.me/api/notify';

		$ch = curl_init();
		$header[] = 'Authorization: Bearer';
		$header[] = $token;
		curl_setopt_array($ch, array(
			CURLOPT_URL => $url,
			CURLOPT_POST => TRUE,
			CURLOPT_RETURNTRANSFER => TRUE,
			CURLOPT_SSL_VERIFYHOST => 0,
			CURLOPT_SSL_VERIFYPEER => 0,
			CURLOPT_HTTPHEADER => array(implode(' ',$header)),
			CURLOPT_POSTFIELDS => http_build_query($initData),
		));

		$result = curl_exec($ch);
		curl_close($ch); 
	}
}

 

而更新文章的部分:只要新、舊文章的狀態都是已發佈就可以了

 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
function updated($new_status, $old_status, $post){
	$postOne = get_post($post); 
	$posrUrl = get_permalink($post);
	$titleOne = $postOne->post_title;
	$author = $post->post_author; /* Post author ID. */
    $name = get_the_author_meta( 'nickname', $author );
	//判斷文章狀態
	if ( $old_status == 'publish'  &&  $new_status == "publish") 
	{         
		$initData['message'] = $name."剛剛更新".$titleOne."→".$posrUrl;
		//$initData['imageThumbnail'] = 'https://i2.kknews.cc/SIG=1hsq8os/ctp-vzntr/r3sn77r39o364q46nps4n57pop734q35.jpg';
		//$initData['imageFullsize'] = 'https://i2.kknews.cc/SIG=1hsq8os/ctp-vzntr/r3sn77r39o364q46nps4n57pop734q35.jpg';
		$initData['stickerPackageId'] = '1';
		$initData['stickerId'] = '106';  
		$token = '*******************************************';
		$url = 'https://notify-api.line.me/api/notify';

		$ch = curl_init();
		$header[] = 'Authorization: Bearer';
		$header[] = $token;
		curl_setopt_array($ch, array(
			CURLOPT_URL => $url,
			CURLOPT_POST => TRUE,
			CURLOPT_RETURNTRANSFER => TRUE,
			CURLOPT_SSL_VERIFYHOST => 0,
			CURLOPT_SSL_VERIFYPEER => 0,
			CURLOPT_HTTPHEADER => array(implode(' ',$header)),
			CURLOPT_POSTFIELDS => http_build_query($initData),
		));

		$result = curl_exec($ch);
		curl_close($ch); 
	}
}
	add_action('transition_post_status','updated',10,3);

 

備註一下參考的說明文件

[WordPress] 捕獲更新、修改、發佈內容的 transition_post_status 事件

WordPress的說明:Post Status Transitions
 

後記

目前程式應該算是能夠正常運作

之後再持續觀察有沒有需要修正的

現在想突破的點就是能不能在後台直接修改外掛

就像其他外掛一樣

不然每次都要從本機端上傳

只是目前看了很多網路教學文章

感覺他們的文筆不是很好,錯字就算了,很多冗詞贅字,跟不知所云的比喻

或者,是因為我的程度太差,才會看不懂