Skip to content

Commit

Permalink
support SSL(https)
Browse files Browse the repository at this point in the history
  • Loading branch information
ASHIJANKEN committed Aug 3, 2018
1 parent 3b2d087 commit 30062c7
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 55 deletions.
102 changes: 58 additions & 44 deletions AutoPost.php
Original file line number Diff line number Diff line change
@@ -1,27 +1,29 @@
<?php
////////////////////////////////////////////////////////////////////////////
// Macでこのphpを実行することを推奨。
// 1. アーカイブを展開。
// 2. 23行目からの修正すべき変数を適宜修正。
// 3. このphpファイルを実行。
// また、事前にクライアントの証明書とクライアントの秘密鍵とそのパスフレーズ、
// プライベートCAの公開鍵証明書を作成しておくこと。
//
// ======以下の手順はWindowsでの方法で、しかも失敗する可能性が高いです!!!======
// 1. アーカイブを展開。
// 2. 「修正すべき変数」セクションの変数を適宜修正。
// 3. WAFに引っかかるのを防ぐため、.htaccessに以下の記述を入れる
// <IfModule mod_siteguard.c>
// SiteGuard_User_ExcludeSig ip(このスクリプトを実行するパソコンのIPアドレス)
// </IfModule>
// 4. このphpファイルを実行。
//
// このスクリプトを走らせる前の準備
// 1. ダウンロードしたアーカイブファイルをとりあえず何でもいいので展開
// 2. 展開したフォルダを7-zipにてパラメータを「cu=on」にして圧縮
// 3. それをwindows標準の機能で展開(右クリック→すべて展開)。展開したフォルダが文字化けしていれば成功。
// 4. 23行目からの修正すべき変数を適宜修正。
// パスの記述をMacに合わせているので、さらにWindowsに合わせるために82行目の「 "/" . 」を消す。
// 5. このphpファイルを実行。
////////////////////////////////////////////////////////////////////////////

require_once "IXR_Library.php";

///////////////////////修正すべき変数ここから///////////////////////////////

$json_files_path = '/Users/user/Downloads/Takeout/Google+ ストリーム'; //「Google+ ストリーム」フォルダのパス
$xmlrpc_path = "http://wordpressblog.com/xmlrpc.php"; //サーバー上のxmlrpc.phpのパス
$domain = 'wordpressblog.net'; // ドメイン名(commonNameと同じものを指定。FQDNになる場合も?)
$xmlrpc_path = '/xmlrpc.php'; // サーバー上のxmlrpc.phpのパス
$pubcert_path = '/Users/hogehoge/demoCA/newcert.pem'; // クライアントの証明書
$privatekey_path = '/Users/hogehoge/demoCA/newkey.pem'; // クライアントの秘密鍵
$sec_pass = 'passphrase'; // newkey.pemのパスフレーズ
$cacert_path = '/Users/hogehoge/demoCA/cacert.pem'; // CAの公開鍵証明書
$json_files_path = '/Users/user/Takeout/Google+ ストリーム/投稿'; // jsonファイルのあるフォルダのパス
$user = 'user'; // ユーザー名
$pass = 'password'; // パスワード

Expand All @@ -33,7 +35,7 @@

function format_time($raw_time_str){
// $raw_time_strの例
// 2014-02-19T11:11:38.000Z
// 2016-03-15 13:10:17+0000

//時差
// $time_difference = 9;
Expand All @@ -42,10 +44,10 @@ function format_time($raw_time_str){
$carry = false;

// 年月日と時間を分割
$split = explode('T', $raw_time_str);
$split = explode(' ', $raw_time_str);

// 時刻部分の整形
$time_split = explode('.', $split[1]);
$time_split = explode('+', $split[1]);
$time_split = explode(':', $time_split[0]);
$hour = $time_split[0];
// $hour = $time_split[0] - $time_difference;
Expand Down Expand Up @@ -79,51 +81,53 @@ function get_data($post_data_dir){

if( is_dir( $post_data_dir ) && $handle = opendir( $post_data_dir ) ) {
while( ($file = readdir($handle)) !== false ) {
if( filetype( $post_path = $post_data_dir . "/" . $file ) == "file" ) {
// $fileがファイルであり、.jsonであるかどうか確認
if( filetype( $post_path = $post_data_dir . "/" . $file ) == "file" && preg_match('#.json$#', $file)) {
// ファイルを読み込んで連想配列を取得
$json_data_raw = file_get_contents($post_path);
$json_data_converted = mb_convert_encoding($json_data_raw, 'UTF-8');
$json_data = json_decode($json_data_converted, true);

// idを確認して、すでに投稿済みならスキップ
if(in_array($json_data['id'], $post_hist_id) == False){
// idを確認して、すでに投稿済みならスキップ(url末尾をidとして利用)
preg_match('#.*/{0}/(.+)$#', $json_data['url'], $post_id_match);
$post_id = $post_id_match[1];
if(in_array($post_id, $post_hist_id) == False){
// タイトルは基本的にjsonから取得
$title = (strcmp($json_data['title'], '') == 0) ? $file : $json_data['title'];
$title = array_key_exists('content', $json_data)
? substr($json_data['content'], 0, 100)
: $file;

// 時刻文字列の整形
$published_date_gmt = format_time($json_data['published']);
$updated_date = format_time($json_data['updated']);
$published_date_gmt = format_time($json_data['creationTime']);
$updated_date = format_time($json_data['updateTime']);

// attachmentがないときもあることを考慮して取得
$attachments = (array_key_exists('attachments', $json_data['object']))
? '[bcd url="' . $json_data['object']['attachments'][0]['url'] . '"]'
: '';
// linkがないときもあることを考慮して取得
$link = array_key_exists('link', $json_data)
? '[bcd url="' . $json_data['link']['url'] . '"]'
: '';

$content = $json_data['object']['content'];
// contentの最後の'?'を除去し(しなくても良いっぽい)
// $content = rtrim($content, '?');
$content = $json_data['content'];
//contentにあるaタグを抽出し、bcdタグで囲い直す
$content = preg_replace('/<a href=((?!>).)*>/', '[bcd url="', $content);
$content = str_replace('</a>', '"]', $content);

// コメントは全部'<br />'でつないで取得
$comments = '';
for($i = 0; $i < $json_data['object']['replies']['totalItems']; $i++){
$item = $json_data['object']['replies']['items'][$i]['object'];
$comments = $comments . '<br />' . $item['content'];
for($i = 0; $i < count($json_data['comments']); $i++){
$comments = $comments . '<br />' . $json_data['comments'][$i]['content'];
}

// contentにアタッチメントとコメントを統合
$content = $content . '<br /><br />' . $attachments . '<br /><br />' . $comments;
// contentにリンクとコメントを統合
$content = $content . '<br /><br />' . $link . '<br /><br />' . $comments;

$post_info = array(
'title' => $title,
'published_date' => $published_date_gmt,
'updated_date' => $updated_date,
'attachment_url' => $attachments,
'attachment_url' => $link,
'content' => $content,
'comment' => $comments,
'id' => $json_data['id'],
'id' => $post_id,
);

// リストに追加
Expand All @@ -137,24 +141,34 @@ function get_data($post_data_dir){

function post_2_blog($post_data_list){
global $hist_file;
global $domain;
global $xmlrpc_path;
global $user;
global $pass;
global $pubcert_path;
global $privatekey_path;
global $sec_pass;
global $cacert_path;

foreach ($post_data_list as $post_data) {
$client = new IXR_Client($xmlrpc_path);
$client = new IXR_ClientSSL($domain, $xmlrpc_path);

// SSLのための設定
$client->setCertificate($pubcert_path, $privatekey_path, $sec_pass);
$client->setCACertificate($cacert_path);

$status = $client->query(
"wp.newPost", //使うAPIを指定
1, // blog ID: 通常は1
1, // blog ID: 通常は1
$user, // ユーザー名
$pass, // パスワード
array(
'post_author' => $user, // 投稿者ID 未設定の場合投稿者名なしになる。
'post_author' => $user, // 投稿者ID 未設定の場合投稿者名なしになる。
'post_status' => 'draft', // 投稿状態(draftにすると下書きにできる)
'post_title' => $post_data['title'], // タイトル
'post_content' => $post_data['content'], // 本文
'post_date_gmt' => $post_data['published_date'], // 投稿の作成日時。
'comment_status' => 'open', //コメントを許可
'post_title' => $post_data['title'], // タイトル
'post_content' => $post_data['content'], // 本文
'post_date_gmt' => $post_data['published_date'], // 投稿の作成日時。
'comment_status' => 'open', //コメントを許可
)
);

Expand Down
8 changes: 5 additions & 3 deletions IXR_Library.php
Original file line number Diff line number Diff line change
Expand Up @@ -362,7 +362,7 @@ function serve($data = false)
{
if (!$data) {
if (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] !== 'POST') {
header('Content-Type: text/plain'); // merged from WP #9093
header('Content-Type: text/plain'); // merged from WP #9093
die('XML-RPC server accepts POST requests only.');
}

Expand Down Expand Up @@ -679,11 +679,11 @@ function query()
$gettingHeaders = false;
}
if (!$gettingHeaders) {
// merged from WP #12559 - remove trim
// merged from WP #12559 - remove trim
$contents .= $line;
}
if ($this->debug) {
$debugContents .= $line;
$debugContents .= $line;
}
}
if ($this->debug) {
Expand Down Expand Up @@ -1194,6 +1194,8 @@ function query()
// (I swear I've fixed this before... ESP in live... But anyhu...)
$curl=curl_init('https://' . $this->server . ':' . $this->port . $this->path);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
// curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
// curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);

//Since 23Jun2004 (0.1.2) - Made timeout a class field
curl_setopt($curl, CURLOPT_TIMEOUT, $this->timeout);
Expand Down
23 changes: 15 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,30 @@
Google+からエクスポートしたjsonファイルの記事を自動的にwordpressに下書きとして投稿するスクリプト

## 使い方
1. [Google データエクスポート](https://takeout.google.com/settings/takeout)を使って、Google+のデータをエクスポート。
1. SSLを用いる都合上、事前にクライアントの証明書とクライアントの秘密鍵とそのパスフレーズ、プライベートCAの公開鍵証明書を作成しておくこと。取得方法は[このサイト](https://blog.ashija.net/2018/08/04/post-3071/)を参照。
1. [Google データエクスポート](https://takeout.google.com/settings/takeout)を使って、Google+のデータをエクスポート。
**データはJSON形式でエクスポートすることに注意。**
1. ダウンロードしたzipを展開。
1. AutoPost.phpの29行目からの修正すべき変数を適宜修正。
1. AutoPost.phpの「修正すべき変数」セクションの変数を適宜修正。
1. WAFに引っかかるのを防ぐため、.htaccessに以下の記述を入れる。
```
<IfModule mod_siteguard.c>
SiteGuard_User_ExcludeSig ip(このスクリプトを実行するパソコンのIPアドレス)
</IfModule>
```
1. AutoPost.phpを実行。

使う手順は「AutoPost.php」の最初にも書いてあります。

## 注意事項
**現状、Macでしか正常に動作しません。**
Windowsでも動くことは動きますが、波ダッシュ・全角チルダ問題に翻弄され、文字コードに起因するエラーを解消しきれませんでした。
**現状、Macでしか正常に動作しません。**
Windowsでも動くことは動きますが、波ダッシュ・全角チルダ問題に翻弄され、文字コードに起因するエラーを解消しきれませんでした。
投稿する記事の文中に波ダッシュや全角チルダがある場合は、うまくWordPressへ投稿することができない可能性が高いです。

このスクリプトはXML-RPCを利用しています。WordPressの設定で、**XML-RPCを利用できるようにしておいてください。**
このスクリプトはXML-RPCを利用しています。WordPressの設定で、**XML-RPCを利用できるようにしておいてください。**
プラグインによっては、ファイアウォールの設定でXML-RPCを利用できないようになっている場合があります。

また、このスクリプトでは、WordPressにおいて **Pz-LinkCard というプラグインを利用していることを前提としています。**
記事中に出てくるURLは
[bcd url="http://xxx"]
また、このスクリプトでは、WordPressにおいて **Pz-LinkCard というプラグインを利用していることを前提としています。**
記事中に出てくるURLは
[bcd url="http://xxx"]
という形に括られてからWordPressに投稿されます。

0 comments on commit 30062c7

Please sign in to comment.