Avatar billede cht22 Professor
21. oktober 2017 - 23:21 Der er 12 kommentarer og
1 løsning

Hente nyhedsgrupper fra usenet til webside

Jeg har lavet denne kode som kan hente nyeste meddelelse fra en nyhedsgruppe. Men hvordan får jeg det til at virke rigtigt?

Nu har jeg indsat sleep for at der ventes på information bliver modtaget. Findes der ikke en bedre måde?

Den skal jo bruge den information der modtages til at sende næste data. Jeg har søgt en del efter dette på nettet, men har ikke kunnet finde information om hvordan man venter på f.eks. en linje er modtaget eller selve meddelelsen er hentet. Er der andre der kan finde information om dette?

Det er jo ikke bare som f.eks. at hente en webside, hvor der sendes en forespørgsel og man venter på serveren afbryder forbindelsen. Hvordan er min opbygning af php-koden i øvrigt?

<pre>
<?php
echo "<h1>Newsgroups</h1>";

define('news_username', '???');
define('news_password', '???');
define('host', 'news.sunsite.dk');

echo "Undersøger om nødvendig funktion understøttes...<br>";
var_dump(function_exists("socket_connect"));
var_dump(function_exists("socket_create"));

socket_function();

function socket_function()
{
    if (!($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP))) {
        $errorcode = socket_last_error();
        $errormsg = socket_strerror($errorcode);
        die("Couldn't create socket: [{$errorcode}] {$errormsg} \n");
    }
    echo "Socket created<br>";
    if (!socket_connect($sock, host, 119)) {
        $errorcode = socket_last_error();
        $errormsg = socket_strerror($errorcode);
        die("Could not connect: [{$errorcode}] {$errormsg} \n");
    }
    echo "Connection established<br>\n";

    $msg = "MODE READER\r\n";
    $msg .= "AUTHINFO USER " . news_username . "\r\n";
    $msg .= "AUTHINFO PASS " . news_password . "\r\n";

    //Send the message to the server
    if (!socket_send($sock, $msg, strlen($msg), 0)) {
        $errorcode = socket_last_error();
        $errormsg = socket_strerror($errorcode);
        die("Could not send data: [{$errorcode}] {$errormsg} \n");
    }
    echo "Message send successfully<br>\n";

  sleep(3);

    if (socket_recv($sock, $buf, 65535, 0) === FALSE) {
        $errorcode = socket_last_error();
        $errormsg = socket_strerror($errorcode);
        die("Could not receive data: [{$errorcode}] {$errormsg} \n");
    }
    //print the received message
    echo "Result: " . $buf . "<br>";

    $msg = "group dk.edb.admin\r\n";
    //Send the message to the server
    if (!socket_send($sock, $msg, strlen($msg), 0)) {
        $errorcode = socket_last_error();
        $errormsg = socket_strerror($errorcode);
        die("Could not send data: [{$errorcode}] {$errormsg} \n");
    }
    echo "Message send successfully<br>\n";

  sleep(3);

    if (socket_recv($sock, $buf, 65535, 0) === FALSE) {
        $errorcode = socket_last_error();
        $errormsg = socket_strerror($errorcode);
        die("Could not receive data: [{$errorcode}] {$errormsg} \n");
    }
    //print the received message
    echo "Result: " . $buf . "<br>";

    $data_array = array();
    $data_array = explode(" ",$buf);

    if ($data_array[0] == "211") {
      $count_article = $data_array[1];
      $first_article = $data_array[2];
      $last_article = $data_array[3];

      $msg = "ARTICLE " . $last_article . "\r\n";
      //Send the message to the server
      if (!socket_send($sock, $msg, strlen($msg), 0)) {
          $errorcode = socket_last_error();
          $errormsg = socket_strerror($errorcode);
          die("Could not send data: [{$errorcode}] {$errormsg} \n");
      }
      echo "Message send successfully: " . $msg . "<br>\n";

      sleep(3);
      if (socket_recv($sock, $buf, 1000000, 0) === FALSE) {
          $errorcode = socket_last_error();
          $errormsg = socket_strerror($errorcode);
          die("Could not receive data: [{$errorcode}] {$errormsg} \n");
      }
      //print the received message
      echo "<hr size=1>";
      echo "Message: " . $buf . "<br>";
      echo "<hr size=1>";
    }

    $msg = "QUIT\r\n";
    //Send the message to the server
    if (!socket_send($sock, $msg, strlen($msg), 0)) {
        $errorcode = socket_last_error();
        $errormsg = socket_strerror($errorcode);
        die("Could not send data: [{$errorcode}] {$errormsg} \n");
    }
    echo "Message send successfully<br>\n";

    //Now receive reply from server
    if (socket_recv($sock, $buf, 65535, MSG_WAITALL) === FALSE) {
        $errorcode = socket_last_error();
        $errormsg = socket_strerror($errorcode);
        die("Could not receive data: [{$errorcode}] {$errormsg} \n");
    }
    //print the received message
    $visual = $buf;

    echo "<hr size=1>" . $visual;

    socket_close($sock);
}
?>
</pre>
Avatar billede cht22 Professor
21. oktober 2017 - 23:26 #1
Fik skrevet dk.edb.admin i koden det er der ikke nogen der hedder. Der er en der hedder: dk.admin
Avatar billede arne_v Ekspert
21. oktober 2017 - 23:41 #2
Vaer lidt doven. Find et PHP library med support for NNTP og brug det i.s.f. selv at boevle med det.

:-)
Avatar billede cht22 Professor
21. oktober 2017 - 23:57 #3
Fandt noget her:
https://github.com/robinvdvleuten/php-nntp

Så må jeg lige finde ud af om det er brugbart.
Avatar billede arne_v Ekspert
22. oktober 2017 - 00:14 #4
Ja.

Der er ogsa andre.

https://pear.php.net/package/Net_NNTP/

https://github.com/sspssp/phpNNTP

og indbygget i PHP:

http://us.php.net/manual/en/book.imap.php    (ja den skulle ogsaa understoette NNTP)
Avatar billede cht22 Professor
22. oktober 2017 - 00:14 #5
Det kan jeg ikke lige finde ud af. Findes der en zip fil man kan hente?

Eller er der andre steder man kan hente et PHP library?
Avatar billede arne_v Ekspert
22. oktober 2017 - 00:24 #6
Paa github kan du clicke paa den groenne knap og vaelge zip fil.
Avatar billede cht22 Professor
22. oktober 2017 - 00:29 #7
Ja vi fik lige skrevet samtidig:

Jeg har lige prøvet denne:
https://pear.php.net/package/Net_NNTP/

Virker umiddelbart rigtig godt.
Avatar billede cht22 Professor
22. oktober 2017 - 01:16 #8
Men nu var det på en Windows server jeg prøvede det. Jeg ville gerne have noget der virker i Linux
Avatar billede arne_v Ekspert
22. oktober 2017 - 03:10 #9
PEAR burde vaere ren PHP og derfor ogsaa virke paa Linux.
Avatar billede cht22 Professor
22. oktober 2017 - 09:16 #10
Jeg får denne fejl:

Warning: require_once(Log.php): failed to open stream: No such file or directory in /home/f/i/ftp_findlinksdk/temp_nntp/common.inc.php on line 80

Fatal error: require_once(): Failed opening required 'Log.php' (include_path='/usr/local/phpbin/PEAR/:./') in /home/f/i/ftp_findlinksdk/temp_nntp/common.inc.php on line 80


Og hvis jeg opretter en tom fil der hedder Log.php så får jeg denne fejl:

Fatal error: Class 'Log' not found in /home/f/i/ftp_findlinksdk/temp_nntp/common.inc.php on line 85


Du kan selv se det her:
http://findlinks.dk/temp_nntp/
Avatar billede cht22 Professor
22. oktober 2017 - 19:57 #11
Jeg har fået noget til at virke:

https://findlinks.dk/temp_nntp/2/

Hentning af en meddelelse:
https://findlinks.dk/temp_nntp/2/article.php

Koden kan ses her:
https://findlinks.dk/temp_nntp/2/article.txt

Jeg får bare denne fejl, hvad gør jeg ved det?

Deprecated:  Non-static method PEAR::isError() should not be called statically in /home/f/i/ftp_findlinksdk/temp_nntp/2/article.php on line 20
Avatar billede arne_v Ekspert
23. oktober 2017 - 02:31 #12
Den siger at:

if (PEAR::isError($article)) {

boer vaere:

if ($etellerandet->isError($article)) {

maaske:

if ($nntp->isError($article)) {
Avatar billede cht22 Professor
09. marts 2021 - 02:27 #13
Bruger ikke længere php-side til at hente nyhedsgrupper fra usenet til webside
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester