ホームページ >バックエンド開発 >PHPチュートリアル >thinkphp WeChat開発がコーススケジュールを取得
編集者は WeChat の開発に初めて触れました。私はずっと、授業のスケジュールと成績を確認できる WeChat 機能を作りたいと思っていました。しばらく研究した後、ここで共有します。エディターは普段たくさんのコースを持っているため、この記事は急いで書かれた可能性があり、コードはあまり標準化されていません。皆さんがもっと意見を交換できることを願っています。
デザインアイデア: まずページにログインして COOKIES を取得し、次に Cookie を使用して確認コードのサーバーを見つけます。最後に、サーバーが必要とするすべての情報を提供します。実際、平たく言えば、ブラウザのアクセス インターフェイスをシミュレートし、Cookie を使用して教育管理システムへの手動ログインを置き換えます。
1. CURL の PHP リクエストとブラウザによって発行された PHP は 2 つの異なるスレッドに属しているため、関数の実装には CURL ライブラリを使用します。
2. sessionID の本質
クライアントはセッション ID を cookie で保存します
クライアントはサーバーにリクエストするときに、この sessionID を一緒にサーバーに送信し、サーバーはメモリ内で対応するセッション ID を検索します。対応するセッション ID が見つかった場合は、ログインしていて対応するアクセス許可を持っていることを意味します。対応するセッション ID が見つからない場合は、ブラウザを閉じたかどうかを意味します。理由は後で説明します)、またはセッションがタイムアウトした場合 (20 分以上サーバーにリクエストがなかった場合)、セッションはサーバーによってクリアされ、サーバーは新しいセッション ID を割り当てます。再度ログインし、この新しいセッション ID を Cookie に保存する必要があります。クライアントはセッションIDの保存にCookieを使用しませんブラウザが閉じていない場合(この時点でセッションIDがCookieに保存されている場合)、セッションIDは常にブラウザに保存され、リクエストが送信されるたびにセッションIDがサーバーに送信されます。もちろん、サーバーに長時間リクエストしなかった場合、サーバーはブラウザを閉じたと認識します。この時点で、サーバーはセッション ID をメモリから消去します。この時点でサーバーに再度リクエストすると、セッション ID が存在しないため、サーバーはメモリ内で対応するセッション ID を見つけることができないため、通常は新しいセッション ID を生成する必要があります。
クライアントはセッションIDの保存にCookieを使用しません この時点で、サーバーにリクエストすると、セッションIDが送信されていないため、サーバーはあなたがセッションIDを保存すると認識します。これはまったく新しいリクエストであり、サーバーは新しいセッション ID を割り当てます。そのため、新しいブラウザを開くたびに (以前にログインしたかどうかに関係なく)、新しいセッション ID が生成されます (または、再度ログインするよう求められます)。ブラウザを閉じ、再度開いてページを再度リクエストすると、ログインできるようになります。これはなぜですか?明らかにログインしていますが、セッション ID はまだサーバー上にあるはずです。なぜ今再度ログインする必要があるのでしょうか。これは、ブラウジングをオフにして再度リクエストすると、送信した情報にはサーバーに送信したばかりのセッション ID が含まれていないため、サーバーは私たちが同一人物であることを認識せず、そのためサーバーは新しいセッションを割り当てます。このときの ID 例: ブラウザーは銀行口座を開設しようとしている人のようなもので、サーバーは銀行口座を開設しようとしている人に似ています (セッション ID)。 )この時点では、銀行に到着した後、銀行員は彼に口座を持っているかどうか尋ね、彼がノーと答えた場合、銀行はこの時点で彼の口座を開設します。したがって、新しいブラウザを開いてページをリクエストするたびに、サーバーはこれが新しいリクエストであると判断し、新しいセッション ID を割り当てると言えます。
get_headers() は、HTTP リクエストに応じてサーバーによって送信されたヘッダーを含む配列を返す PHP システムレベルの関数です。失敗した場合は FALSE を返し、E_WARNING レベルのエラー メッセージを発行します (リモート ファイルが存在するかどうかを判断するために使用できます)。
関数定義
array get_headers ( string $url [, int $format = 0 ] )
Parameters
url ターゲットURL
format オプションのformatパラメータが1に設定されている場合、get_headers () は対応する情報を解析し、配列のキーを設定します。
class TestController extends Controller {
public functionindex() {
$url = 'http://学務室ログインアドレス';
$u = get_headers ( $ url, 1 );
$login_url = 'http://学務室ログインアドレス' . dirname ( $u ['Location'] ) '/default2.aspx';
$hiden = $this-> getView ( $login_url );
$post_fields = array (
'txtUserName' => '学生 ID',
'TextBox2' => 'パスワード',
'RadioButtonList1' => '学生',
'__VIEWSTATE' => $hiden,"Button1" => " ログイン "
);
$cookie_file = tempnam ( 'Public', 'cookie' );
$ch =curl_init ( $login_url );
curl_setopt ( $ch, CURLOPT_HEADER, 0 ); // ヘッダーを表示します
curl_setopt ( $ch, CURLOPT_POST, 1 ) // 配信後
$header [] = ' User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML、Gecko など) Chrome/34.0.1847.116 Safari/537.36';
curl_setopt ( $ch, CURLOPT_HTTPHEADER, $header ); // シミュレーション クライアント
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 0 ); // ページを表示
curl_setopt ( $ch, CURLOPT_POSTFIELDS, $post_fields ) // ポストパス値
curl_setopt ( $ch, CURLOPT_COOKIEJAR, $cookie_file ); // 保存cookie
curl_setopt ( $ch, CURLOPT_FOLLOWLOCATION, 1 ); // リダイレクトを許可
curl_close ( $ch );
curl_close ( $ch );
$class_url = 'ログインアドレス' . dirname ( $u ['所在地'] . '/xskbcx.aspx?xh=' . '学生ID';
$main_url = '教務室ログインアドレス' . ] ) . '/xs_main.aspx?xh=' . 'Student ID';
$this->getClass ( $class_url, $main_url );
}
//ログイン ページの非表示フィールド
private function getView($url) {
$result =curl_request ( $url );
$pattern = '//is';preg_match_all ( $pattern, $result, $matches );
$res [0] = $ matches [1] [0];
return $res [0];
}
// クエリクラススケジュール
public function getClass($url, $main_url) {
$cookie_file = tempnam ( 'Public' 、 'cookies' );
$ch =curl_init ( $url );
curl_setopt ( $ch, CURLOPT_TIMEOUT, 60 );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt ( $ch, OPT_REFER ER , $ main_url );
curl_setopt ( $ch, CURLOPT_COOKIEJAR, $cookie_file ); // Cookie を保存します
$str =curl_exec ( $ch );
$this->classResult ( $str );
}
// クラススケジュール文字列を返します
private function classResult($result) {
preg_match_all ( '/([\w\W]*?)<\/table>/', $result, $out );
$table = $out [0] [0];
// クラス全体のスケジュールを取得
//print_r($table);
preg_match_all ( '/([\w\W]*?)< ;\/td> ;/', $table, $out );$td = $out [1];$length = count ( $td ); //print_r($td) ;
// コースリストを取得します
for($i = 0; $i
$td [$i] = str_replace ( "", "", $td [$i] );
$reg = "/{( .*)}/";
if (! preg_match_all ( $reg, $td [$i], $matches )) {
unset ( $td [$i] );}
}
$td = array_values($td); //コースリスト配列のインデックスを再作成します $tdLength = count($td);$this->converttoTable ( $td );
}
}