Posted by bottticelli in I2P

Greetings, fellow ramblers.

I would like to ask you about the implementation of a simple user count for my eepsite (now being just a static HTML page). As far as I researched this question, for clearnet the situation is roughly as follows:

  1. There is relatively easy way of doing this with JavaScript, which does not satisfy me since I do not want my eepsite working with JavaScript, it's nasty and collects too much data about the users. I personally hate JavaScript-demanding sites, even more do I dislike them in darkweb.

  2. There are lots of free user counters available in clearnet, they say 'just sign up for free, even without email, and choose any design you want, then paste your URL here and we will do the rest'. Such solutions are obviously obnoxious since I have no control over the amount of information they would have been possessing, and certainly i2p link won't work with that (if I'm wrong here, please correct me). Maybe there are some good and transparent services for user count across the i2p network?

  3. There is another way of creating a PHP script dealing with it, still relatively easy. Seems to be perfect, but I wonder if there are any simpler ways. To my knowledge, there is no way of performing this in HTML alone, since it has to be server-side (however, if I misunderstood something, again please do point me to my ignorance).

Apart from technicalities, I see one more interesting and subtle question here concerning the philosophy (let me take the liberty of using that term) of Invisible Internet. I am going to raise this question in a distinct submission soon, and I heartily encourage all of you to join the discussion. Meanwhile, please give me a hint about the forum where it could be the most relevant. AskRamble? I2P? Anonymity? Privacy? Whatever?

5

Comments

You must log in or register to comment.

z3d wrote (edited )

With the default I2P webserver (Jetty), assuming you have perl installed, you can run perl scripts from eepsite/cgi-bin. Something like the following will provide a basic pagecounter when embedded in a iframe:

#!/usr/bin/perl

use strict;
use warnings;

# File to store the page counter
my $counterFile = "counter.txt";

# Read current counter value from file
my $counter = 0;
if (-e $counterFile) {
open(my $fh, '<', $counterFile);
$counter = <$fh>;
chomp($counter);
close($fh);
}

# Increment the counter
$counter++;

# Save updated counter value to file
open(my $fh, '>', $counterFile);
print $fh $counter;
close($fh);

# Generate HTML page counter span
print "Content-Type: text/html\n\n";
print "<span id=\"counter\">$counter</span>\n";
4

not_bob wrote

Very good, but it should really use flock for file locking to prevent possible race conditions.

But, so long as the site isn't getting a really large number of hits, this is unlikely to be a problem even if you don't use it.

1

not_bob wrote

If you have a static site, you are limited to using someone else's counter. There is no way to run PHP code from a static site. Also, even if you were to use JavaScript, there is no way for your static site to store that data. So, still not an option.

The only real solution with such a site is to use someone else's counter as you mention in #2.

Not all I2P users have a clearnet outproxy configured. So, using a clearnet service is not the best option. Possible privacy issues aside.

I have a counter on the front of my notbob page. If you mouse over the van on the upper left side you will see a little box with a green graph. While it does not currently show the count, it still counts.

It would not be hard to write a multi-user count. I could likely code one up that would work for anyone pretty quickly. Something basic that just displays a number.

You would embed it into the html code with <img src="http://countersite.i2p/cgi-bin/counter.cgi?site=324832483">

Note the random number. There would be no need for me to even know what site it's counting for.

And, that would all you would have to do on your end. That is if you just want a count. If you want graphs and more complex breakdowns, that's another story.

But, a simple one would be easy. And, as for privacy, so long as you trust the person who's counter you are using, then you are good.

Feel free to hit me up on IRC if you want to discuss this further.

As for discussion, this is a good place to do it.

2

not_bob wrote (edited )

I have written a counter you can use in a static site.

To use the counter just include the following code in your html.

<img src="http://5gn3ca4z4occksx2cnwbcrun2mum2eg2c7zgfi7k7fetruwzmdiq.b32.i2p/counter.cgi?site=123842384" height=30>

Change the site number to a random number, and that will be your site number. Feel free to adjust the height to anything you want, the output is a svg file, so it will scale.

You could even use a different site number for each page on your site. Each site has it's own unique count.

As for logging. That server logs access just as any other normal webserver does. I do not share the data with anyone, and the only identifying information that is collected by the server is the b32 of the client who hits the site and the time/date.

2

bottticelli OP wrote

Thank you very much /u/not_bob/, I appreciate. However, as of now this feature is not working on my side. There is blank space in place of the counter rectangle. What can be the possible issue? How do you think?

2

not_bob wrote

I have added a way to change the color. just add &color=color to the end of the url and it will change the text color. The background will be transparent.

You can use any normal color name, red, green, blue, purple, orange, plum, and so on. If you don't like these colors, try others.

if you do not specify a color it will default to black. If you try an invalid color, it will default to black.

2

not_bob wrote

It should show a transparent box with a black number in it. If your site is set to dark mode that will not work.

So long as your browser has access to I2P it should work.

1

not_bob wrote (edited )

In the near future I plan to be writing more little toys like this. Then plan is to have a toys.notbob.i2p site with a list of useful things.

Here is code what what I have running. You can see an example of it running here http://5gn3ca4z4occksx2cnwbcrun2mum2eg2c7zgfi7k7fetruwzmdiq.b32.i2p/count.html

To use it, you need include code like the following.

<img src="http://5gn3ca4z4occksx2cnwbcrun2mum2eg2c7zgfi7k7fetruwzmdiq.b32.i2p/conter.cgi?page=123456789k&color=green" height=40>

Pick a number. That will be your site number. Or, you can use a new number for each html page. But, any page with the same number will increment that number's count.

As for the color. Use normal color names. They should work. No hex colors. If you do not specify a color then it will default to black text. The background will be transparent.

Anyone is welcome to use this freely. Enjoy!


#!/usr/bin/perl

# code by notbob.i2p

use warnings;
use Fcntl ':flock'; # Import LOCK_* constants
use Time::HiRes qw(usleep); # For sub-second sleeping
use CGI qw/:standard/;

$site = param("site");
$site =~ s/\D//g;

$color = param("color");

$color = lc($color);
$color =~ s/[^a-z]//g;

if ( $color eq "" ) { $color = "black"; }

print("Content-type: image/svg+xml\n\n");

# File to store the page counter
my $counterFile = "/comhtml/5gn3ca4z4occksx2cnwbcrun2mum2eg2c7zgfi7k7fetruwzmdiq.b32.i2p/counter/$site.txt";

# Function to read the current counter value
sub read_counter {
 my ($filename) = @_;
 open(my $fh, '<', $filename) or die "Cannot open file $filename: $!";
 flock($fh, LOCK_SH); # Shared lock for reading
 my $counter = <$fh>;
 chomp($counter);
 close($fh);
 return $counter;
}

# Function to increment and save the counter
sub save_counter {
 my ($filename, $counter) = @_;
 open(my $fh, '>', $filename) or die "Cannot open file $filename: $!";
 while (!flock($fh, LOCK_EX | LOCK_NB)) {
 # If the file is locked, wait a short time and try again
 usleep(100000); # 100 milliseconds
 }
 print $fh $counter;
 close($fh);
}

# Read current counter value from file
my $counter = -e $counterFile ? read_counter($counterFile) : 0;

# Increment the counter
$counter++;

# Save updated counter value to file
save_counter($counterFile, $counter);

# Generate HTML page counter span
#print "Content-Type: text/html\n\n";
#print "<span id=\"counter\">$counter</span>\n";

print "<svg width=\"100\" height=\"50\" xmlns=\"http://www.w3.org/2000/svg\">
 <text x=\"10\" y=\"40\" font-family=\"Arial\" font-size=\"40\" fill=\"$color\">$counter</text>
</svg>";

To use this, you will also need to create a counter directory on the webserver and give it read-write permission for whatever webserver you are running.

2