2 //YANMAH2 - Yet ANother Mobile Accelerated HatenaHaiku
3 //(c) 2016 YANMAH2 project
4 //This program is freesoftware. you can redistribute it and/or modify it under the terms of the [GNU Affero GPL v3](http://www.gnu.org/licenses/agpl.html).
7 define("HELLO","world");
8 require_once "product_definitions.php";
9 require_once "configurable_variables.php";
10 require_once "common_functions.php";
13 require_once 'init_processor.php';
14 // var_dump($_SESSION);
15 if (isset($_GET["reftime"]) && $_GET["reftime"] != '') {
16 header('Cache-Control: private, max-age=' . 60*60*24);
20 $selfcall = htmlspecialchars($_SERVER["PHP_SELF"], ENT_QUOTES);
21 $safequery = htmlspecialchars($_SERVER["QUERY_STRING"], ENT_QUOTES);
23 <?php //セキュリティのための前処理。
25 if (isset($_GET["keyword"])) checkKeyword($_GET["keyword"]);
26 if (isset($_GET['word'])) checkKeyword($_GET['word']);
27 if (isset($_GET['users'])) checkKeyword($_GET['users']);
28 if (isset($_GET["user"])) {
29 checkId($_GET["user"]);
30 $_GET['user'] = preg_replace("/ +$/u", "", $_GET['user']);
32 if (isset($_GET["following"])) {
33 checkId($_GET["following"]);
34 $_GET['following'] = preg_replace("/ +$/u", "", $_GET['following']);
37 if (isset($_GET['page'])) checkPagenum($_GET['page']);
38 if (isset($_GET['image'])) checkImagemode($_GET['image']);
39 if (isset($_SESSION['image'])) checkImagemode($_SESSION['image']);
40 if (isset($_GET['album'])) checkAlbum($_GET['album']);
43 if (!isset($_SESSION['auth']) || $_SESSION['auth'] != TRUE){
45 if (isset($_COOKIE[session_name()])){
46 setcookie(session_name(), '', time() - 42000, dirname($_SERVER['SCRIPT_NAME']) . '/', $_SERVER["SERVER_NAME"]);
53 if (isset($_GET['with']) || isset($_GET['log'])){
54 require 'login_processor.php';
56 // if (isset($_SESSION['oauth_stat'])) session_regenerate_id(TRUE);
60 if (isset($_POST['posting'])){
61 require 'post_processor.php';
66 if (isset($_GET["keyword"]) && $_GET["keyword"] != ''){
67 $get_keyword = htmlspecialchars($_GET["keyword"], ENT_QUOTES);
68 $json_url = "{$api_base_url}statuses/keyword_timeline.xml?word=" . rawurlencode($_GET['keyword']) . "&body_formats=html_touch";
69 $page_head = $get_keyword . " でひとこと";
70 $official = "{$haiku_official_url}keyword/" . rawurlencode($_GET['keyword']);
71 $self_anchor = "http://{$_SERVER["SERVER_NAME"]}{$selfcall}?keyword=" . rawurlencode($_GET['keyword']);
72 $entries_mode = 'keyword_timeline';
73 } elseif (isset($_GET["user"]) && $_GET["user"] != ''){
74 $get_user = htmlspecialchars($_GET["user"], ENT_QUOTES);
75 $json_url = "{$api_base_url}statuses/user_timeline/".$_GET['user'].".xml?body_formats=html_touch";
76 $page_head = "{$get_user} のエントリー";
77 $official = "{$haiku_official_url}{$get_user}/";
78 $self_anchor = "http://{$_SERVER["SERVER_NAME"]}{$selfcall}?user=".rawurlencode($_GET['user']);
79 $entries_mode = 'user_timeline';
80 } elseif (isset($_GET["following"]) && $_GET["following"] != ''){
81 $get_following = htmlspecialchars($_GET["following"], ENT_QUOTES);
82 $json_url = "{$api_base_url}statuses/friends_timeline/".$_GET['following'].".xml";
83 if (isset($_SESSION['auth']) && $_SESSION['auth'] === TRUE
84 && $get_following == $_SESSION['hatenaid']){
85 $json_url_noaouth = $json_url . "?body_formats=html_touch";
86 $json_url = "{$api_base_url}statuses/friends_timeline.xml";
88 $json_url = $json_url . "?body_formats=html_touch";
89 $page_head = "{$get_following} のアンテナ";
90 $official = "{$haiku_official_url}{$get_following}/following";
91 $self_anchor = "http://{$_SERVER["SERVER_NAME"]}{$selfcall}?following=".rawurlencode($_GET['following']);
92 $entries_mode = 'friends_timeline';
93 } elseif (isset($_GET['album']) && $_GET['album'] != ''){
94 if ($_GET['album'] == 'public'){
95 $get_album = 'public';
96 $json_url = "{$api_base_url}statuses/album.xml?body_formats=html_touch";
97 $page_head = 'みんなのアルバム';
98 $official = $haiku_official_url . 'album';
99 $self_anchor = "http://{$_SERVER["SERVER_NAME"]}{$selfcall}?album=".rawurlencode($_GET['album']);
100 $entries_mode = 'album';
102 $get_album = htmlspecialchars($_GET['album'], ENT_QUOTES);
103 $json_url = "{$api_base_url}statuses/album.xml?word=".rawurlencode($_GET['album'])."&body_formats=html_touch";
104 $page_head = $get_album.'のアルバム';
105 $official = $haiku_official_url.'keyword/'.rawurlencode($_GET['keyword']).'?mode=album';
106 $self_anchor = "http://{$_SERVER["SERVER_NAME"]}{$selfcall}?album=public";
107 $entries_mode = 'album';
109 } elseif (isset($_GET['users']) && $_GET['users'] != ''){
110 if ($_GET['users'] == 'public'){
111 $get_users = htmlspecialchars($_GET['users'], ENT_QUOTES);
112 $json_url = $api_base_url.'statuses/public_timeline.xml?count=100&body_formats=html_touch';
113 $page_head = 'ユーザー一覧';
114 $official = $haiku_official_url;
115 $self_anchor = "http://{$_SERVER["SERVER_NAME"]}{$selfcall}?users=public";
116 $entries_mode = 'users';
118 $get_users = htmlspecialchars($_GET['users'], ENT_QUOTES);
119 $json_url = $api_base_url.'statuses/keyword_timeline.xml?word='.rawurlencode($_GET['users']).'&count=100&body_formats=html_touch';
120 $page_head = $get_users.' のユーザー一覧';
121 $official = "{$haiku_official_url}keyword/" . rawurlencode($_GET['users']);
122 $self_anchor = "http://{$_SERVER["SERVER_NAME"]}{$selfcall}?users=".rawurlencode($_GET['users']);
123 $entries_mode = 'keyword_users';
125 } elseif (isset($_GET['favours']) && $_GET['favours'] != ''){
126 $get_favours = htmlspecialchars($_GET['favours'], ENT_QUOTES);
127 $json_url = "{$api_base_url}statuses/friends_timeline/".$get_favours.".xml";
128 if (isset($_SESSION['auth']) && $_SESSION['auth'] === TRUE
129 && $get_favours == $_SESSION['hatenaid']){
130 $json_url_noaouth = $json_url . "?count=100&body_formats=html_touch";
131 $json_url = "{$api_base_url}statuses/friends_timeline.xml";
133 $json_url = $json_url . "?count=100&body_formats=html_touch";
134 $page_head = $get_favours.' のお気に入り';
135 $official = "{$haiku_official_url}following";
136 $self_anchor = "http://{$_SERVER["SERVER_NAME"]}{$selfcall}?favours={$_GET['favours']}";
137 $entries_mode = 'favours';
139 $json_url = "{$api_base_url}statuses/public_timeline.xml?body_formats=html_touch";
140 $page_head = "みんなのエントリー";
141 $official = $haiku_official_url;
142 $self_anchor = "http://{$_SERVER["SERVER_NAME"]}{$selfcall}";
143 $entries_mode = 'default';
146 if (isset($_GET['page']) && $_GET['page'] != ''){
147 if ($entries_mode == 'default'){
148 $self_anchor_possibly_with_pagenum = $self_anchor . '?page=' . $_GET['page'];
150 $self_anchor_possibly_with_pagenum = $self_anchor . '&page=' . $_GET['page'];
152 $relog_back = $self_anchor_possibly_with_pagenum . '&log=try';
153 $relogin = $self_anchor_possibly_with_pagenum . '&with=haiku&callback='.rawurlencode(rawurldecode($relog_back));
155 if ($entries_mode != 'default'){
156 $self_anchor_possibly_with_pagenum = $self_anchor.'&page=1';
158 $self_anchor_possibly_with_pagenum = $self_anchor.'?page=1';
160 $relog_back = $self_anchor_possibly_with_pagenum . '&log=try';
161 $relogin = $self_anchor_possibly_with_pagenum . '&with=haiku&callback='.rawurlencode(rawurldecode($relog_back));
164 if ($get_image == 'on'){
165 $self_anchor_with_imagemode = $self_anchor_possibly_with_pagenum . '&image=on';
167 $self_anchor_with_imagemode = $self_anchor_possibly_with_pagenum . '&image=off';
169 $relog_back = $self_anchor_with_imagemode . '&log=try';
170 $relogin = $self_anchor_with_imagemode . '&with=haiku&callback='.rawurlencode(rawurldecode($relog_back));
174 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
175 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
176 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
178 <meta http-equiv="Content-Type" content="text/html; charset={$meta_charset}" />
179 <meta http-equiv="Content-Style-Type" content="text/css" />
180 <meta http-equiv="Content-Script-Type" content="text/javascript" />
181 <meta name="viewport" content="initial-scale={$iscale}, minimum-scale=0.1" />
182 <title>{$page_head} - {$site_name} {$site_name_caption}</title>
183 <link rel="stylesheet" href="{$style_sheet}" />
184 <link rel="icon" href="./favicon.ico" type="image/vnd.microsoft.icon" />
185 <link rel="shortcut icon" href="./favicon.ico" type="image/vnd.microsoft.icon" />
186 <link rel="apple-touch-icon" href="./apple-touch-icon.png" />
189 if (isset($starisjs) && $starisjs == '1'){
190 if ($entries_mode != 'users' && $entries_mode != 'keyword_users' && $entries_mode != 'favours'){
191 $echo = $echo . <<<EOL
192 <script type="text/javascript" src="http://s.hatena.ne.jp/js/HatenaStar.js"></script>
193 <script type="text/javascript">
194 Hatena.Star.SiteConfig = {
197 uri: 'a.to-original-link',
199 container: 'span.entry-head'
208 $echo = $echo . <<<EOL
215 // var_dump($_SESSION);
218 $echo = $echo . echoCommonHeader('#navigation-menu', $self_anchor_with_imagemode) . "<hr />\n";
219 $echo = $echo . "<div id=\"header\" class=\"{$entries_mode}\">\n";
220 $echo = $echo . "<h1 id=\"entries-head\" class=\"head1\">{$page_head} <a href=\"{$official}\" class=\"to-original-link\"> ‡ </a></h1>\n<hr />";
221 $echo = $echo . "</div>\n";
222 echo mb_convert_encoding($echo, $charcode, 'UTF-8');
226 if (isset($_SESSION['auth']) && $_SESSION['auth'] === TRUE){
227 if ($device_who == 'ktai'){
232 $echo = $echo . '<div class="post-box">';
233 $echo = $echo . '<form method="post" action="./post.php" enctype="application/x-www-form-urlencoded" accept-charset="'.$meta_charset.'">';
234 if ($entries_mode == 'keyword_timeline'){
235 $echo = $echo . '<input type="hidden" id="post-keyword" name="keyword" value="' . $get_keyword . '" />';
237 $echo = $echo . '<input type="text" id="post-keyword" name="keyword" maxlength="255" value="';
238 if (isset($_GET['word'])) $echo = $echo . htmlspecialchars($_GET['word'],ENT_QUOTES);
239 $echo = $echo . '" title="キーワード" size="80" /><br />';
241 $echo = $echo . '<textarea id="post-text" name="status" rows="'. $rows .'" cols="80" title="本文">';
242 if (isset($_GET['body'])) $echo = $echo . htmlspecialchars($_GET['body']);
243 $echo = $echo . '</textarea><br />';
244 $echo = $echo . '<input type="hidden" name="posting" value="status" />';
245 $echo = $echo . '<input type="hidden" name="return" value="'.htmlspecialchars($self_anchor_possibly_with_pagenum,ENT_QUOTES).'" />';
246 if (isset($_GET['from']) && $_GET['from'] != ''){
247 $_SESSION['source'] = htmlspecialchars($_GET['from'], ENT_QUOTES);
249 if (isset($_SESSION['source']) && $_SESSION['source'] != ''){
250 $from = $_SESSION['source'];
252 $from = $product_name_abbr;
254 $echo = $echo . <<<EOL
255 <input type="submit" id="post-haiku" value="Haiku!" />
256 <label for="post-from">from </label><input type="text" id="post-from" name="source" value="{$from}" maxlength="170" />
259 $echo = $echo . "return=".htmlspecialchars($self_anchor_with_imagemode,ENT_QUOTES);
260 $echo = $echo . '" class="navigation-link">イマココ</a>';
261 $echo = $echo . '</form>';
262 if (isset($_SESSION['post_result']) && $_SESSION['post_result'] != ''){
263 $echo = $echo . '<div class="post-result">';
264 // var_dump($_SESSION);
265 if ($_SESSION['post_result'] === TRUE){
266 // var_dump($_SESSION['post_to']);
267 if ($_SESSION['post_to'] == 'hateb'){
268 // var_dump($_SESSION['post_body']);
269 $echo = $echo . echoHateBxml(simplexml_load_string($_SESSION['post_body']));
271 $json_body = $_SESSION['post_body'];
272 $contents = checkEntryData($json_body);
273 if (preg_match("/^oauth_problem=token_rejected$/", $json_body)){
274 $echo = $echo . "<p>アクセストークンが無効になっています。<a href=\"{$relogin}\">再認証</a>を行なってください。</p>";
275 } elseif ($contents['stat'] == FALSE && $contents['ercode'] != 'x'){
276 $echo = $echo . "<p>何かのエラーです。</p>\n";
277 $echo = $echo . print_r(strip_tags($contents['contents']));
278 $echo = $echo . "<br />{$json_body}</blockquote>\n";
279 } elseif ($contents['stat'] == FALSE && $contents['ercode'] == 'x'){
280 $echo = $echo . "<p>何かのエラーですす。</p>\n";
281 $echo = $echo . "<blockquote>{$contents['ermes']}</blockquote>\n";
283 $echo = $echo . '<span>' . $_SESSION['post_result_mes'] . '</span>';
284 $entry_processor_mode = "entry"; $eprocessor_sub_mode = 'presult';
285 $val = $contents['contents'];
286 require 'entry_processor.php';
287 unset($eprocessor_sub_mode);
288 $echo = $echo . "<hr />\n";
293 if ($_SESSION['post_result'] === FALSE){
294 $echo = $echo . '<span>' . $_SESSION['post_result_mes'] . '</span>';
295 $echo = $echo . "<blockquote>{$_SESSION['post_error']}</blockquote>";
297 $echo = $echo . '</div>';
298 $_SESSION['post_to'] = '';
299 $_SESSION['post_result'] = '';
300 $_SESSION['post_result_mes'] = '';
301 $_SESSION['post_error'] = '';
302 $_SESSION['post_body'] = '';
303 libxml_clear_errors();
305 $echo = $echo . '</div>';
306 echo mb_convert_encoding($echo, $charcode, 'UTF-8');
309 if (isset($_SESSION['oauth_stat'])){
310 $echo = $echo . '<div class="oauth-res">'."\n";
311 if ($_SESSION['oauth_stat'] === TRUE) {
312 $echo = $echo . "<span>アクセストークンを更新しました。</span>\n";
314 $echo = $echo . "<span>アクセストークンを取得できませんでした。</span>\n";
315 $echo = $echo . "<blockquote>{$_SESSION['oauth_stat']}</blockquote>";
317 $echo = $echo . '</div>'."\n";
318 echo mb_convert_encoding($echo, $charcode, 'UTF-8');
324 $echo = $echo . '<div class="contents">'."\n";
325 function constRequest($json_url){
326 global $ecount, $entries_mode;
327 if (isset($_GET["reftime"]) && $_GET["reftime"] != '') {
328 $request_url = $json_url . '&reftime=' . rawurlencode($_GET['reftime']);
329 } elseif (!isset($_GET["page"])){
330 $request_url = $json_url;
332 $request_url = $json_url.'&page='.$_GET["page"];
334 if (isset($ecount) && !preg_match("/users|keyword_users|favours/", $entries_mode)){
335 $request_url = $request_url . '&count=' . $ecount;
339 $request_url = constRequest($json_url);
340 // var_dump($entries_mode);
341 // var_dump($request_url);
342 // var_dump($request_url);
344 // var_dump($get_image);
345 if (isset($_SESSION['auth']) && $_SESSION['auth'] === TRUE){
346 $json = getJson($request_url, TRUE, $conkey, $conkey_sec, $_SESSION['acstoken'], $_SESSION['acs_sec']);
347 if (preg_match("/^oauth_problem=token_rejected$/", $json['body'])){
348 $echo = $echo . "<p class=\"oauth-res\">アクセストークンが無効になっています。<a href=\"{$relogin}\">再認証</a>を行なってください。</p>";
349 $json = getJson(constRequest($json_url_noaouth), FALSE);
351 if ($json['stat'] !== TRUE){
352 $contents = strip_tags($json['stat']);
353 $echo = $echo . "<p>はてなハイク API からデータを取得できなかったような気がします。</p>\n";
354 $echo = $echo . "<blockquote>";
355 if (isset($json['http'])) echo "HTTP {$json['http']}<br />";
356 $echo = $echo . "{$json['stat']}<br />{$contents}</blockquote>\n";
357 $timeline_putted = FALSE;
359 $json_body = $json['body'];
360 $contents = checkEntryData($json_body);
361 if ($contents['stat'] == FALSE && $contents['ercode'] != 'x'){
362 // var_dump($contents);
363 // var_dump($json['body']);
364 $echo = $echo . "<p>はてなハイク API からデータを取得できなかったような気がします。</p>\n";
365 $echo = $echo . "<blockquote>HTTP {$json['http']}<br />";
366 $echo = $echo . 'XML error '.$contents['ercode'].':'.$contents['ermes'];
367 $echo = $echo . "<br /><pre>".strip_tags($json['body'])."</pre></blockquote>\n";
368 $timeline_putted = FALSE;
369 } elseif ($contents['stat'] == FALSE && $contents['ercode'] == 'x'){
370 $echo = $echo . "<p>はてなハイク API からデータを取得できなかったような気がします。</p>\n";
371 $echo = $echo . "<blockquote>HTTP {$json['http']}<br />{$contents['ermes']}</blockquote>\n";
372 $timeline_putted = FALSE;
374 // var_dump($contents);
376 if ($entries_mode == 'default' || $entries_mode == 'album'){ $dict = array(); $spam = 0; }
377 if ($entries_mode == 'users' || $entries_mode == 'keyword_users' || $entries_mode == 'favours'){
379 $echo = $echo . "<dl class=\"users-list\">\n";
381 foreach ($contents['contents'] as $val){
382 echo mb_convert_encoding($echo, $charcode, 'UTF-8');
384 if ($entries_mode == 'users' || $entries_mode == 'keyword_users' || $entries_mode == 'favours'){
385 $entry_processor_mode = 'users';
386 require 'entry_processor.php';
388 $entry_processor_mode = "entries";
389 require 'entry_processor.php';
390 echo mb_convert_encoding($echo, $charcode, 'UTF-8');
393 $timeline_putted = TRUE;
395 if (isset($spam) && $spam > 0) $echo = "<p>{$spam} スパムっぽいのを表示しませんでした。</p>";
396 if ($entries_mode == 'users' || $entries_mode == 'keyword_users' || $entries_mode == 'favours') {
397 $echo = $echo . "</dl>\n";
399 $echo = $echo . '<p>' . count($ustock) . '/' . count($contents['contents']) .
400 ' unique</p>' . "\n";
405 $echo = $echo . '<p>内容を読むには<a href="./login.php?return='.rawurlencode(rawurldecode($self_anchor_with_imagemode)).'" class="navigation-link">ログイン</a>してください。</p>';
407 echo mb_convert_encoding($echo, $charcode, 'UTF-8');
411 // var_dump($contents);
412 if (isset($_SESSION['auth']) && $_SESSION['auth'] === TRUE){
413 if ($entries_mode == 'keyword_timeline' || $entries_mode == 'keyword_users'){
414 if (isset($timeline_putted) && $timeline_putted === TRUE){
415 $object_key = $contents['contents']->status[0]->keyword;
416 $object_title = $contents['contents']->status[0]->target->title;
418 if ($entries_mode == 'keyword_timeline'){
419 $object_key = $_GET['keyword'];
420 $object_title =$_GET['keyword'];
422 if ($entries_mode == 'keyword_users'){
423 $object_key = $_GET['users'];
424 $object_title = $_GET['users'];
427 // var_dump($status_0);
428 if (preg_match("/^{$http_url_regexp}$/u", $object_key)){
429 // if (preg_match("/&/u", $object_key)){
430 // $echo = $echo . '<p>URL: <a href="'.$mobile_gateway.rawurlencode(rawurldecode($object_key)).'" class="external-link">'.htmlspecialchars($object_title,ENT_QUOTES).'</a> を<a href="mailto:b@hatena.ne.jp?body='.rawurlencode(rawurldecode($object_key)).'">メールではてなブックマークに追加する。</a></p>';
432 // $echo = $echo . '<form method="post" action="" enctype="application/x-www-form-urlencoded" accept-charset="'.$meta_charset.'" class="hateb-form">'."\n";
433 // $echo = $echo . '<label>URL: <a href="'.$mobile_gateway.rawurlencode(rawurldecode($object_key)).'" class="external-link">'.htmlspecialchars($object_title,ENT_QUOTES).'</a> をはてなブックマークに追加する。</label><br />';
434 // $echo = $echo . '<label for="bcomment">コメント:</label>';
435 // $echo = $echo . '<input type="text" id="bcomment" name="comment" maxlength="100" value="" title="ブックマークコメント" />';
436 // $echo = $echo . '<input type="hidden" name="url" value="'.$get_keyword.'" />';
437 // $echo = $echo . '<input type="hidden" name="posting" value="hateb" />';
438 // $echo = $echo . '<input type="hidden" name="return" value="'.htmlspecialchars($self_anchor_possibly_with_pagenum, ENT_QUOTES).'" />';
439 // $echo = $echo . '<input type="submit" id="post-hateb" value="[B!]" title="URL をはてなブックマークに追加する。" />';
440 // $echo = $echo . '</form>';
443 } elseif (preg_match("/^(asin:)([[:alnum:]])+$/u", $object_key)){
444 $asin = preg_replace("/^(asin:)([[:alnum:]]+)$/u", "\${2}", $object_key);
445 $echo = $echo . '<p class="to-amazon"><a href="'.'http://www.amazon.co.jp/gp/aw/d.html/?a='.$asin.'" class="external-link">'.$object_title.' を Amazon.co.jp で見る。</a></p>';
446 } elseif (preg_match("/^id:[a-zA-Z1234567890]{1}[-_a-zA-Z1234567890@]{1,30}[a-zA-Z1234567890]{1} *$/u", $object_key)){
448 // $echo = $echo . '<form method="post" action="" enctype="application/x-www-form-urlencoded" accept-charset="'.$meta_charset.'" class="hateb-form">'."\n";
449 // $echo = $echo . '<label>このハイクキーワードをはてなブックマークに追加する。</label><br />';
450 // $echo = $echo . '<label for="bcomment">コメント:</label>';
451 // $echo = $echo . '<input type="text" id="bcomment" name="comment" maxlength="100" value="" title="ブックマークコメント" />';
452 // $echo = $echo . '<input type="hidden" name="url" value="http://'.$haiku_host.'/keyword/'.htmlspecialchars($get_keyword, ENT_QUOTES).'" />';
453 // $echo = $echo . '<input type="hidden" name="posting" value="hateb" />';
454 // $echo = $echo . '<input type="hidden" name="return" value="'.htmlspecialchars($self_anchor_possibly_with_pagenum, ENT_QUOTES).'" />';
455 // $echo = $echo . '<input type="submit" id="post-hateb" value="[B!]" title="このハイクキーワードをはてなブックマークに追加する。" />';
456 // $echo = $echo . '</form>';
460 $echo = $echo . '</div>';
461 echo mb_convert_encoding($echo, $charcode, 'UTF-8');
467 $navi_imaging = TRUE;
468 require 'footer_include.php';
469 $echo = $echo . '</div></body></html>';
470 echo mb_convert_encoding($echo, $charcode, 'UTF-8');
471 if (isset($_SESSION['oauth_stat'])) unset($_SESSION['oauth_stat']);