By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
424,678 Members | 2,192 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 424,678 IT Pros & Developers. It's quick & easy.

rapidshare upload perl script for linux

P: 3
Hello,
I am new at the community and newbie at programming :)
As you may know rapidshare provides a perl script for linux, to upload files at their servers.
You can find the original scripts at rapidshare news :

Expand|Select|Wrap|Line Numbers
  1. http://images.rapidshare.com/software/rsapi.pl

If you test it you will see that you can upload one file at time.
I try to modify it in that way that script can read a text file with the names of the files i want to upload.
But the script works only if there one name file at the text.
If i try with two files (lets say File Finder_48x48.png and Dashboard_128x128.png) i take this result:

Expand|Select|Wrap|Line Numbers
  1. thanos@localhost ~/rapid2 $ perl rsapiteliko.pl Unsuccessful stat on filename containing newline at rsapiteliko.pl line 52. File Finder_48x48.png Dashboard_128x128.png is empty or does not exist! 
When the text file contains only one name file it works :confused:
The script as i modified is this :


Expand|Select|Wrap|Line Numbers
  1. #!/usr/bin/perl 
  2.  
  3. # RapidShare AG OpenSource Perl Uploader V1.0. For non-commercial use only. All rights reserved.
  4. # Included: Uploading to free, collector's and premium-zone. The MD5-check after uploads checks if the upload worked.
  5. # NOT included in this version: Upload-resume via new RS API.
  6. # This is a PERL script written for experts and for coders wanting to know how to write own upload programs.
  7. # Tested under Linux and Linux only.
  8. # If you write your own upload-tools, please look at our rsapi.cgi calls. You need them to have fun.
  9. #
  10. # To upload a file, put this script on a machine with perl installed and use the following syntax:
  11. # perl rsapi.pl free mytestfile.rar        (this uploads mytestfile.rar as a free user)
  12. # perl rsapi.pl prem archive.rar 334 test  (this uploads archive.rar to the premium-zone of login 334 with password test)
  13. # perl rsapi.pl col a.rar testuser mypw    (this uploads a.rar to the collector's-zone of login testuser with password mypw)
  14. #
  15. # We will publish another version with upload resume enabled soon, but this script actually works and we actually
  16. # want you to understand how it works and upload resume would make this script even more complex.
  17.  
  18.  
  19. #Edited by 8anos
  20. #Find the original script here: http://images.rapidshare.com/software/rsapi.pl
  21.  
  22.  
  23.  
  24.  
  25. use strict;
  26. use warnings;
  27. use Digest::MD5("md5_hex");
  28. use Fcntl;
  29. use IO::Socket;
  30.  
  31. my ($x, $text, $file, $filename, $uploadpath, $size, $socket, $uploadserver, $cursize, $fh, $bufferlen, $buffer, $boundary, $header, $contentheader,
  32. $contenttail, $contentlength, $result, $maxbufsize, $md5hex, $filecontent, $size2, %key_val, $login, $password, $zone);
  33.  
  34.  
  35.  
  36. # This chapter sets some vars and parses some vars.
  37. $/ = undef;
  38. $text ="up.txt"; #This is text with the files which you want to upload
  39. open (INFO, "$text") || die("Could not open file!");
  40. my @plirof=<INFO>;
  41. close (INFO);
  42.  
  43. foreach $x (@plirof) {
  44.  
  45. $file = $x || die "Syntax: $0 <filename to upload> <free|prem|col> [login] [password]\n";
  46. $zone = 'prem'; #If you use Free Rapidshare change "prem" to free
  47. $login = 'username'; # Your username, if your previous choise is free you havent to change it
  48. $password = 'password'; #Your password σας, if your previous choise is free you havent to change it
  49. $maxbufsize = 64000;
  50. $uploadpath = "l3";
  51. $cursize = 0;
  52. $size = -s $file || die "File $file is empty or does not exist!\n";
  53. $filename = $file =~ /[\/\\]([^\/\\]+)$/ ? $1 : $file;}
  54.  
  55.  
  56.  
  57.  #This chapter checks the file and calculates the MD5HEX of the existing local file.
  58. print "File $file has $size bytes. Calculating MD5HEX...\n";
  59. open(FH, $file) || die "Unable to open file: $!\n";
  60. $filecontent = <FH>;
  61. close(FH);
  62. $md5hex = uc(md5_hex($filecontent));
  63. $size2 = length($filecontent);
  64. print "MD5HEX is $md5hex ($size2 bytes analyzed.)\n";
  65. unless ($size == $size2) { die "Strange error: $size bytes found, but only $size2 bytes analyzed?\n" }
  66.  
  67.  
  68.  
  69. # This chapter finds out which upload server is free for uploading our file by fetching (URL address blocked: See forum rules)/cgi-bin/rsapi.cgi?sub=nextuploadserver_v1
  70. if ($login and $password) { print "Trying to upload to your premium account.\n" } else { print "Uploading as a free user.\n" }
  71. print "Uploading as filename '$filename'. Getting upload server infos.\n";
  72. $socket = IO::Socket::INET->new(PeerAddr => "rapidshare.com:80") || die "Unable to open port: $!\n";
  73. print $socket qq|GET /cgi-bin/rsapi.cgi?sub=nextuploadserver_v1 HTTP/1.0\r\n\r\n|;
  74. ($uploadserver) = <$socket> =~ /\r\n\r\n(\d+)/;
  75. unless ($uploadserver) { die "Uploadserver invalid? Internal error!\n" }
  76. print "Uploading to ul$uploadserver$uploadpath.rapidshare.com\n";
  77.  
  78.  
  79.  
  80. # This chapter opens our file and the TCP socket to the upload server.
  81. foreach $x (@plirof) {
  82.  
  83. $file = $x;
  84. sysopen($fh, $file, O_RDONLY) || die "Unable to open file: $!\n";
  85. $socket = IO::Socket::INET->new(PeerAddr => "ul$uploadserver$uploadpath.rapidshare.com:80") || die "Unable to open port: $!\n";}
  86.  
  87.  
  88.  
  89. # This chapter constructs a (somewhat RFC valid) HTTP header. See how we pass rsapi_v1=1 to the server to get a program-friendly output.
  90. $boundary = "---------------------632865735RS4EVER5675865";
  91. $contentheader .= qq|$boundary\r\nContent-Disposition: form-data; name="rsapi_v1"\r\n\r\n1\r\n|;
  92.  
  93. if ($zone eq "prem" and $login and $password) {
  94.   $contentheader .= qq|$boundary\r\nContent-Disposition: form-data; name="login"\r\n\r\n$login\r\n|;
  95.   $contentheader .= qq|$boundary\r\nContent-Disposition: form-data; name="password"\r\n\r\n$password\r\n|;
  96. }
  97.  
  98. if ($zone eq "col" and $login and $password) {
  99.   $contentheader .= qq|$boundary\r\nContent-Disposition: form-data; name="freeaccountid"\r\n\r\n$login\r\n|;
  100.   $contentheader .= qq|$boundary\r\nContent-Disposition: form-data; name="password"\r\n\r\n$password\r\n|;
  101. }
  102.  
  103. $contentheader .= qq|$boundary\r\nContent-Disposition: form-data; name="filecontent"; filename="$filename"\r\n\r\n|;
  104. $contenttail = "\r\n$boundary--\r\n";
  105. $contentlength = length($contentheader) + $size + length($contenttail);
  106. $header = qq|POST /cgi-bin/upload.cgi HTTP/1.0\r\nContent-Type: multipart/form-data; boundary=$boundary\r\nContent-Length: $contentlength\r\n\r\n|;
  107.  
  108.  
  109.  
  110. #This chapter actually sends all the data, header first, to the upload server.
  111. print $socket "$header$contentheader";
  112.  
  113. while ($cursize < $size) {
  114.   $bufferlen = sysread($fh, $buffer, $maxbufsize, 0) || 0;
  115.   unless ($bufferlen) { die "Error while sending data: $!\n" }
  116.   print "$cursize of $size bytes sent.\n";
  117.   $cursize += $bufferlen;
  118.   print $socket $buffer;
  119. }
  120.  
  121. print $socket $contenttail;
  122.  
  123.  
  124.  
  125. # OK, all is sent. Now lets fetch the server's reponse and analyze it.
  126. print "All $size bytes sent to server. Fetching result:\n";
  127. ($result) = <$socket> =~ /\r\n\r\n(.+)/s;
  128. unless ($result) { die "Ooops! Did not receive any valid server results?\n" }
  129. print "$result >>> Verifying MD5...\n";
  130.  
  131. foreach (split(/\n/, $result)) {
  132.   if ($_ =~ /([^=]+)=(.+)/) { $key_val{$1} = $2 }
  133. }
  134.  
  135.  
  136.  
  137. # Now lets check if the result contains (and it should contain) the MD5HEX of the uploaded file and check if its identical to our MD5HEX.
  138. unless ($key_val{"File1.4"}) { die "Ooops! Result did not contain MD5? Maybe you entered invalid login data.\n" }
  139. if ($md5hex ne $key_val{"File1.4"}) { die qq|Upload FAILED! Your MD5HEX is $md5hex, while the uploaded file has MD5HEX $key_val{"File1.4"}!\n| }
  140. print "MD5HEX value correct. Upload completed without errors. Saving links to rsulres.txt\n\n\n";
  141.  
  142.  
  143.  
  144. # Maybe you want the links saved to a logfile? Here we go.
  145. open(O, ">>rsulres.txt");
  146. print O $result . "\n";
  147. close(O);
  148.  
  149.  
  150.  
  151. # Thats it. Have fun experimenting with this script. Now lets say...
  152. exit;
  153.  

I will be happy if anyone can help.
Thanks in advance :)
Feb 8 '07 #1
Share this Question
Share on Google+
9 Replies


miller
Expert 100+
P: 1,089
Welcome

Don't modify their script. Create a new script that will wrap around theirs and give you this increased functionality. By modifying their code you risk introducing errors, and you potentially force yourself to have to make updates again if they update their software and protocol.

Simply create a new perl script that parses a text file for file names and then simply calls the rapid script for each file individually.

If you have any problems doing this, feel free to ask here.
Feb 8 '07 #2

P: 3

Simply create a new perl script that parses a text file for file names and then simply calls the rapid script for each file individually.

If you have any problems doing this, feel free to ask here.
Thank you for your answer.
I' ll try it. :)
Feb 8 '07 #3

P: 3

Simply create a new perl script that parses a text file for file names and then simply calls the rapid script for each file individually.

If you have any problems doing this, feel free to ask here.
well now i need your help.

How i call the original rs script?

here is a script that makes multiple text files with file names
Expand|Select|Wrap|Line Numbers
  1.  
  2.  
  3. my ($filepath, $file3);
  4. print "Give the path of the directory\n\n ";
  5.  
  6. $filepath=<STDIN>;
  7. chop $filepath;
  8.  
  9. my $count=1;
  10. my $new1= "new1.txt";
  11.  
  12. #Open and read the directory
  13. opendir (FILEPATH, $filepath) || die "cannot open $filepath!!";
  14. while ($file3=readdir FILEPATH) {
  15.  
  16. open (NF, ">$new1");
  17. print NF "$filepath/$file3\n" ;
  18.  
  19.  
  20. close NF;
  21.  
  22.  
  23. $new1++
  24.  
  25. }
  26.  
any help?
thanks in advance :)
Feb 12 '07 #4

miller
Expert 100+
P: 1,089
There are lots of different methods to call another script. There's always backticks or a system call. I would recommend that you call do though

http://perldoc.perl.org/functions/do.html

Expand|Select|Wrap|Line Numbers
  1. {
  2.    local @ARGV = ("free", "$filepath/$file3"); # Set parameters
  3.    do "rsapi.pl";
  4. }
  5.  
Feb 13 '07 #5

KevinADC
Expert 2.5K+
P: 4,059
[
Expand|Select|Wrap|Line Numbers
  1. {
  2.    local @ARGV = ("free", "$filepath/$file3"); # Set parameters
  3.    do "rsapi.pl";
  4. }
  5.  
Isn't that just too cool! :)
Feb 13 '07 #6

KevinADC
Expert 2.5K+
P: 4,059
maybe if you comment out this line in the rsapi.pl file it will work for multiple files:

Expand|Select|Wrap|Line Numbers
  1. $/ = undef;
change it to:

Expand|Select|Wrap|Line Numbers
  1. #$/ = undef;
and chomp the array to be safe:

Expand|Select|Wrap|Line Numbers
  1. my @plirof=<INFO>;
  2. chomp(@plirof);
Feb 13 '07 #7

P: 1
Im confused

Does anyone has the complete Script for multiple files upload Rapidshare???

because I read many little parts in this thread .. but not a final

Thanks !!
Nov 14 '07 #8

P: 1
I took the shortcut and wrapped rsapi.pl inside a bash script. I didn't want to mess with their code.

for i in *;do rsapi "$i" col username passwd;done

lame I know but it works.
Nov 16 '07 #9

P: 1
Sorry for bringing it up but i really would like to know if someone has managed to make the perl script for multiple files and post it here.

thank you in advance
Jan 9 '08 #10

Post your reply

Sign in to post your reply or Sign up for a free account.