사용자:Ryos/Watchlist RSS 피더

이 코드는 실뱅 슈미츠의 PHP RSS 피드를 개조한 것이다. 그의 코드와 나의 변화는 모두 GFDL에 의해 공개된다.

나는 위키피디아에 가입하자마자 내 감시목록의 RSS 피드를 원했다. 불행히도, 위키피디아 소프트웨어는 그 기능을 지원하지 않는다. 많은 위키피디아가 그 문제를 해킹하고 있는 것 같지만, 그 페이지에 있는 해결책은 하나도 내게 효과가 없었다. 실뱅 슈미츠가 가까웠지만 (공용) 웹서버(그리고 나는 프랑스어를 할 줄 모른다)에 올릴 필요가 없었다. 그래서 실베인의 코드를 해킹해서 내가 원하는 걸 할 수 있는지 알아내기 시작했어 이것이 그 결과니, 유용하게 쓰시기를 바라오.

작동시키는 데 필요한 사항

  1. 로컬 컴퓨터의 스크립트를 구독할 수 있는 RSS 리더. 내가 아는 유일한 독자가 이것을 할 수 있는 유일한 사람은 NetNewsWire이고, 그것은 오직 Mac이다.
  2. 명령줄 PHP 스크립트를 실행하도록 적절하게 구성된 PHP 4.3.0 이상 설치. Mac OS X는 즉시 제공되므로 Windows에서 어떻게 하는지 모르겠다(PHP 매뉴얼 참조).
  3. 3단계는 없다.

작동시키는 방법

  1. 아래 코드를 텍스트 파일에 복사하고 .php 확장명으로 이름을 지정하십시오. 저장할 때 스크립트가 쿠키 파일을 같은 디렉터리에 저장한다는 점에 유의하십시오.
  2. 스크립트를 구성하십시오. 아래 변수를 설정하십시오.
    1. $163_name = 'yourname';
    2. $163_password = 'yourpass';
    3. $wp_tmz = 'GMT에서 시간 영역 오프셋'; //ex: -06:00(내 영역)
    4. $script_name = "script.php를 지정한 이름"; //쿠키 이름을 지정하는 데 사용됨
  3. 스크립트를 실행 가능으로 설정하십시오. 이렇게 하려면 터미널을 열고 "chmod +x "(따옴표 없음)를 입력하십시오. 그런 다음 스크립트 파일을 터미널 창으로 끌어다 놓고 return을 누르십시오.
  4. NetNewsWire의 스크립트를 구독하십시오. 스크립트 유형을 "첨부 파일"에서 "Shell 스크립트"로 변경하십시오.

알려진 문제

  1. 이 글씨를 보면 파싱이 다소 깨져 있다. 이는 대본이 작성된 이후 페이지 구조가 바뀌었기 때문에 의심의 여지가 없다. 스크립트는 여전히 대부분 작동하며 가끔 잘못된 링크나 잘못된 정보가 있는 항목을 생성한다. 불행히도, 나는 요즘 꽤 바쁘고 이 대본을 고칠 의욕이 별로 없다. 만약 당신이 그것을 고친다면, 업데이트된 버전을 게시하십시오. 미안해, 그리고 고마워. 료스 07:35, 2007년 11월 6일 (UTC)
  2. %2로 urlenced되는 / 문자로 인해 하위 페이지(읽고 있는 이 페이지는 하위 페이지)에 대한 연결이 끊어짐f
  3. 그것은 아마도 비영어 위키에는 효과가 없을 것이다. 나는 실베인 슈미츠의 프랑스 현지화 버전에서 파싱 코드를 약간 수정해야만 en과 함께 작동하기 때문에 이렇게 말한다.wikipedia.org
  4. 나는 NetNewsWire가 이전에 피드에 나타난 기사에 대한 편집 내용을 선택하지 않고 응용프로그램에 의해 캐시된 상태로 남아 있다는 것을 발견했다. 이를 해결하기 위한 두 가지 방법이 있다.
    1. NNW 환경설정을 활성화하여 업데이트된 기사에 대한 차이점을 강조하거나
    2. 가입에 대한 정보를 얻고, 특별한 지속성 설정을 사용하도록 설정하고, 0일 후에 피드에서 사라지도록 항목을 설정할 수 있다. 이건 내가 선호하는 선택사항이야.
나는 이러한 해결책이 필요하지 않도록 피드를 수정하는 것이 가능할 것이라고 생각하지만, 솔직히 나는 RSS 피드에 대해 아무것도 모른다; 나는 실베인의 코드를 수정할 수 있었지만, 그 정도는 되었다.

위시리스트

만약 당신이 시간, 능력, 그리고 이것들 중 하나(또는 당신 자신의 아이디어)를 추가할 의향이 있다면, 그렇게 하십시오. 결국 오픈 소스야.

  1. 명령줄 인수를 통한 구성. 이것은 실제로 구현되지만 NetNewsWire와 연동할 수 없어서 코멘트를 했고, 그 이유는 잘 모르겠다.
  2. Applecript 래퍼로 표준 시간대 자동 가져오기 가능한지 확실하지 않지만, 그래야 해.
  3. 둘 이상의 Wikimedia 프로젝트에서 워치리스트를 가져오고 모두 로컬로 기본 제공되는 기능. 아마도 지역화된 버전만으로도 가능할 것이다. 왜냐하면 그 가치가 있는 뉴스레더는 여러 구독을 하나로 통합할 수 있기 때문이다.

(닥치고 우리에게 보여줘) 코드

#!/usr/bin/php <?php /* 토도  -달러 계약 없이 익명 편집이 지원될 수 있는지 여부 결정:   현재 어레이의 유일한 목적    -구성 가능 설정   -별첨이 없는 표준 시간대 파악   -NNW 매개 변수가 있는 사용자 이름/통과 설정 고려    -NNW가 파라암을 퍼트리는 것 같다. 도오!   */ /******************************************************************************* watchlistss - 당신의 watchlist의 피드를 생성하는 스크립트. 실베인 슈미츠의 대본에 근거한 것: http://meta.wikimedia.org/wiki/User:Sylvain_Schmitz/Watchlist_RSS_feed_in_PHP 라이언 발란티네(료스)가 수정  원본에서 내가 변경한 내용은 다음과 같다.  -PHP 명령줄 SAPI에서 실행 가능  -영어 위키백과에 현지화  -RSS 피드 정보를 더 유용한 형식으로 변경  -NetNewsWire로 출력 방식 변경  용도의 내용:  이 대본은 위키피디아에서 당신의 감시 목록을 읽고 그것을 사람으로 변환한다.  구독할 수 있는 기능이 있는 뉴스레더에서 읽을 수 있는 RSS 피드  로컬 시스템의 스크립트에 연결하십시오. 내가 아는 유일한 독자는 이 능력을 가지고 있다.  맥에서 NetNewsWire.  사용 방법:  1) 이 코드를 텍스트파일에 복사하여 .php 확장명으로 이름짓는다.     저장할 때 스크립트가 쿠키 파일을 같은 위치에 저장한다는 점에 유의하십시오.     전화번호부  2) 스크립트를 구성한다. 아래 변수를 설정하십시오.   $163_name = 'yourname';   $163_password = 'yourpass';   $wp_tmz = 'GMT에서 시간 영역 오프셋'; //ex: -06:00(내 영역)   $script_name = "script.php를 지정한 이름"; //쿠키 이름을 지정하는 데 사용됨  3) 스크립트를 실행 가능하게 한다. 이렇게 하려면 터미널을 열고 다음을 입력하십시오.     chmod +x      그런 다음 스크립트 파일을 터미널 창으로 끌어다 놓고 return을 누르십시오.  4) NetNewsWire의 스크립트를 구독하십시오. 스크립트 유형 변경 확인     "첨부 파일"에서 "Shell 스크립트"로 변경하십시오.  5) 너는 이제 한 마리의 고리타분한 장난꾸러기가 되었다. 즐거운 시간 되세요.   알려진 버그/이슈:  - %2로 urlenced되는 / 문자로 인해 하위 페이지에 대한 링크가 끊어짐f *******************************************************************************/    /******************************************************************* */   $printDebug = 거짓의;    // 서버의 표준 시간대(기본값은 GMT)   /*$180_tmz = "+00:00";      // 옵션 구문 분석   $script_name = $argv[0];      ($i = 1; $i < 카운트 ($argv); $i++) {        스위치($argv[$i]) {         사례 "-u":         사례 "--사용자":     $luse_name = $argv[$i+1];     $i++;     깨지다;   사례 "-p":   사례 "-통과":     $163_password = $argv[$i+1];     $i++;     깨지다;   사례 "-t":   사례 "시간대":     $165_tmz = $argv[$i+1];     $i++;     깨지다;   사례 "-d":     $printDebug = true;     깨지다;    }   }   if (institutes ($flict_name)이 비어 있는 경우($flict_pass    exit("\nUsage: [-u --user] 사용자 이름 [-p --pass] password\n\n");   }*/      $suval_name = 'yourusername';   $suv_password = '당신의 비밀번호';   $180_tmz = "+00:00";   $script_name = '감시자들'php';      //디버깅 여부를 기준으로 오류 보고 설정   만일 (!$printDebug)  { ini_set ('display_properties', '0'); }   다른  { ini_set ('display_properties', '1'); }    // 기본 도메인 및 경로   $suval_domain    = 'en.wikipedia.org';   $suv_watchlist = '/wiki/특수:워치리스트';    // 피드의 최대 항목 수   $max_max = 20;    // 월 이름에 대한 지역화된 배열   달러화 = 배열하다 ("1월" => "01", "2월" => "02", "3월" => "03",                    "4월" => "04", "5월" => "05", "준" => "06",                    "7월" => "07", "8월" => "08", "9월" => "09",                    "10월" => "10", "11월" => "11", "12월" => "12");    // 지역화된 사용자 페이지 접두사   $property_userpage = "사용자:";    // 지역화된 제목   $180_190 = "감시 목록";    // 현지화된 설명   $180_190 = "$suval_name$180_190";    /***************************************************************** */    // 쿠키 파일 이름   $suv_file  = $script_name .'_'. $suval_domain .'_cookie';    // 쿠키에서 만료 시간 가져오기   $time = 0;   $180_fp = 터놓고 이야기 ($suv_file, "r");   만일 ($180_fp)     {       하는 동안에 (!가짜의 ($180_fp))         {           달러화 = 똥을 싸다 ($180_fp, 4096);           만일 (스트로스 (달러화, "wikiUserID") !== 거짓의)             {               $ce = 폭발시키다 ("\t", 달러화);                $time = $ce[4];               부숴뜨리다;             }         }       클로즈드 ($180_fp);     }    // 새 로그인이 필요한지 확인   만일 (($time - 60) < 시간 ())     {       // 로그인 URL       $180_190 = '/w/index.php?title=특수:사용자 로그인'         .'&action=propertylogin&type=property';        // 로그인 연결       달러화 = curl_init ();        $postdata = 배열하다 ();       $postdata['wpName']         = $suval_name;       $postdata['wpPassword']     = $suv_password;       $postdata['wpRember']     = '1';       $postdata['wpLoginattempted'] = '진짜';       $post = 무효의;        앞을 내다 ($postdata 로서 $key=>달러 가치)         만일 ($key && 달러 가치)            $post .= $key."=".URLEN코드(달러 가치)."&";        curl_setopt (달러화, CULLOPT_MUTE,         진실의);       curl_setopt (달러화, CURLOPT_POST,         진실의);        curl_setopt (달러화, CURLOPT_POSTFieldS,   $post);       curl_setopt (달러화, CURLOPT_COOKieJAR,    $suv_file);       curl_setopt (달러화, CURLOPT_URL,          $suval_domain.$180_190);       curl_exec   (달러화);       curl_close  (달러화);     }    // 내용물 파악   $content = curl_init ();   curl_setopt ($content, CULLOPT_RETURNTRANS, 진실의);   curl_setopt ($content, 컬옵트_쿠키필레,     $suv_file);   curl_setopt ($content, CURLOPT_COOKieJAR,      $suv_file);   curl_setopt ($content, CURLOPT_URL,            $suval_domain.$suv_watchlist);   $watchlist = curl_exec ($content);   curl_close  ($content);    // ISO8601 시간 및 날짜에 대한 기능   기능을 하다 to_iso8601 ($date_str)     {       전지구적 달러화;       $date_message = 폭발시키다 (" ", $date_str);       $day = $date_message[0];       만일 (끈적끈적하게 하다 ($day) == 1)         $day = "0".$day;       월불 = $date_message[1];       년도 = $date_message[2];       돌아오다 년도."-".달러화[월불]."-".$day."T";     }            // 내용물을 일 단위로 폭발시키다   정의를 내리다 ('길이_TIMESTR', 5);   정의를 내리다 ('ANON_TITLETEXT', '특수:기부금');      $days     = 폭발시키다 ("[h4]", $watchlist);   달러화    = 배열하다();   달러화   = 배열하다();   달러화 = 배열하다();   달러화  = 배열하다();   달러화    = 배열하다();   달러화  = 배열하다();   엔테리 = 0;   을 위해 ($i = 1; $i < 의 크기 ($days) && 엔테리 < $max_max; $i++)     {       $the_date = to_iso8601 (기판을 달다 ($days[$i], 0,                                       스트로스 ($days[$i], "[/h4]")));                                           달러 라인 = 폭발시키다 ("<<</>", $days[$i]);       $tmp = 폭발시키다 (" . . ", $days[$i]);              //message       만일 ($printDebug)  {     메아리치다 "\$줄들 $i:";     메아리치다 "\n"; print_r (달러 라인); 메아리치다 "\n\n";     메아리치다 "tmp $i:";     메아리치다 "\n"; print_r ($tmp); 메아리치다 "\n\n";    }              을 위해 ($j = 0; $j < 의 크기 ($tmp)-1 && 엔테리 < $max_max; $j++)         {           //message           달러화 = 스트로스 (달러 라인[$j], '<a href=") + 15;           달러화[엔테리] = 기판을 달다 (달러 라인[$j], 달러화,                                       스트로스 (기판을 달다 (달러 라인[$j], 달러화), '"'));                      //message           달러화 = 스트로스 (달러 라인[$j], '[tt]');           달러화[엔테리] = 기판을 달다 (달러 라인[$j], 달러화);                                 //message           달러화 = 스트로스 ($tmp[$j+1], '제목=") + 8;           달러화[엔테리] = 기판을 달다 ($tmp[$j+1], 달러화,                                   스트로스 (기판을 달다 ($tmp[$j+1], 달러화), '"'));                      //message           달러화 = 스트로스 ($tmp[$j], '; ') + 2;           달러화[엔테리] = $the_date.기판을 달다 ($tmp[$j], 달러화, 길이_TIMESTR).$180_tmz;                      //message           //익명의 편집은 다른 결과를 낳는다. 우리는 그것을 특별히 다루어야 한다.           만일 (달러화[엔테리] != ANON_TITLETEXT)  {       달러화 = 스트로스 ($tmp[$j+1], '제목=".$property_userpage)        + 8 + 끈적끈적하게 하다 ($property_userpage);       달러화[엔테리] = 기판을 달다 ($tmp[$j+1], 달러화,            스트로스 (기판을 달다 ($tmp[$j+1], 달러화), '"'));     }     다른  {      달러화 = 스트로스 ($tmp[$j+1], '제목=".ANON_TITLETEXT)        + 8 + 끈적끈적하게 하다 (ANON_TITLETEXT) + 2;       달러화[엔테리] = 기판을 달다 ($tmp[$j+1], 달러화,            스트로스 (기판을 달다 ($tmp[$j+1], 달러화), '<'));     }                      //message           달러화 = 스트로스 (달러 라인[$j], '제목=") + 8;           달러화[엔테리] = 기판을 달다 (달러 라인[$j], 달러화,                                   스트로스 (기판을 달다 (달러 라인[$j], 달러화), '"'));           달러화[엔테리] .= ' . . '. 달러화[엔테리];                      엔테리++;         }     }          //message     만일 ($printDebug)  {   메아리치다 "links:\n"; print_r (달러화);   메아리치다 "titles:\n"; print_r (달러화);   메아리치다 "descriptions:\n"; print_r (달러화);   메아리치다 "entries:\n"; print_r (달러화);   메아리치다 "times:\n"; print_r (달러화);   메아리치다 "authors:\n"; print_r (달러화);  }    /************************************************************** RSS 생성 */    $allowed_xml = 배열하다 ("&", "<", ">");   $productions_xml = 배열하다 ("&amp;", "&lt;", "&gt;");      $출력 = '';    // 헤더   $출력 .= "<?xml 버전=\"1.0\" 인코딩=\"utf-8\"?>\n";   $출력 .= "<!DOCTYPE rdf:RDF [\n";   $출력 .= "<!ENTITY % HTMLlat1 Public(공용)\n";   $출력 .= " \"-//W3C//ENTITES(XHTML//EN)용 라틴 1\"\n";   $출력 .= " \"http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent\">\n";   $출력 .= "]>\n";   $출력 .= "<rdf:RDF"\n";   $출력 .= " xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" \n";   $출력 .= " xmlns:sy=\"http://purl.org/rss/1.0/modules/syndication/\"\n";   $출력 .= " xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n"; //$출력 .= "xmlns:content=\"http://purl.org/rss/1.0/modules/content/\"\n";   $출력 .= "xmlns=\"http://purl.org/rss/1.0/\"\n";   $출력 .= ">\n";          // 채널 요약   $출력 .= <채널 rdf:about=>\"http://"          .$suval_domain.str_them ($allowed_xml,                                   $productions_xml,                                   $suv_watchlist)."\">\n";   $출력 .= <<title>>$180_190</기호>\n";   $출력 .= "link"slink://"          .$suval_domain.str_them ($allowed_xml,                                   $productions_xml,                                   $suv_watchlist)."\n";   $출력 .= <<description>>$180_190</기호>\n";   $출력 .= "<dc:source>properties://"          .$suval_domain.str_them ($allowed_xml,                                   $productions_xml,                                   $suv_watchlist)."[/dc:출처]\n";   $출력 .= "<dc:date>".날짜를 잡다("Y-m-d.\TH:iO")."[/dc:date]\n";   $출력 .= "<sy:updatePeriod> 시간별로 (/sy:updatePeriod)\n";   $출력 .= "<sy:updateFrequency>4</sy:updateFrequency>"\n";   $출력 .= "sy:updateBase"1970-01-01T00:00+00</sy:updateBase>\n";   $출력 .= <<items>>\n";   $출력 .= " <rdf:Seq>\n";   을 위해 ($i = 0; $i < 엔테리; $i++)     {       $출력 .= <rdf:li resource=>\"http://$suval_domain/wiki/"              .URLEN코드(str_them (" ", "_", 달러화[$i]))."\" />\n";     }   $출력 .= " </rdf:Seq>\n";   $출력 .= " </이름>\n";   $출력 .= "\n";   $출력 .= " </채널>\n";    // 항목   을 위해 ($i = 0; $i < 엔테리; $i++)     {       $출력 .= <<item rdf:about=>>\"http://$suval_domain/wiki/"              .URLEN코드(str_them (" ", "_", 달러화[$i]))."\">\n";       $출력 .= "<title>.".달러화[$i]."\n";       $출력 .= <<description>>{달러화[$i]}</기호>\n";       $출력 .= "dc:190".달러화[$i]."[/dc:dc]\n";       $출력 .= "<dc:date>".달러화[$i]."[/dc:date]\n";       $출력 .= " </이름>\n\n";     }    // 바닥글   $출력 .= "[/rdf:RDF]\n";      퇴장하다 ($출력); ?>