Giter Site home page Giter Site logo

goreport's Introduction

Goreport v3.0, a Gophish Reporting Tool

This script accepts your Gophish campaign ID(s) as a parameter and then collects the campaign results to present the statistics and perform user-agent parsing and geolocation lookups for IP addresses. Goreport generates lists of IP addresses, operating systems, browser types and versions, and locations with counts for the number of times each one was seen throughout the campaign.

A note on statistics: Goreport will report the total number of events and the number of email recipients that participated in each event. In other words, Goreport will show how many times Gophish recorded a "Clicked Link" event and how many recipients clicked a link. These are very different numbers. A campaign sent to 10 people could have 9 Clicked Link events when only 3 recipients clicked a link. Knowing that recipients clicked a link or submitted data more than once is valuable information, but make sure you keep the numbers straight.

Goreport Requirements

This script requires a Gophish server, and active or complete campaign, and the API key for your Gophish application. Get this key by clicking the Settings tab. The API key will be found on the first page. Each Gophish user account has its own API key which acts as the method of authentication for that user to the Gophish API. If you use multiple accounts with Gophish, make sure you grab the correct users API key.

These Python libraries are required as well:

  • Gophish
  • requests
  • xlsxwriter
  • configparser
  • python-docx
  • click
  • user-agents
  • python-dateutil (Required by the Gophish library)

Goreport Setup

You need to do a few things to get started:

  • Run pip install -r requirements.txt.
  • Edit/create a Gophish.config configuration file that looks like the one below.
    • Note: The full host URL is required, so provide http://IP:PORT or https://IP:PORT.
      • Be aware of using HTTP vs HTTPS. If you type in the wrong one you'll receive connection errors.
  • Get your campaign ID(s) by clicking your campaign(s) and referencing the URL(s) (it's the number at the end).
  • If you want to be able to create Word docx reports, drop a "template.docx" template file into the Goreport directory (more information below in Selecting Report Output).

Basic Usage

This example will assume Gophish is on another server and HTTPS is being used. To access the API endpoint, you will need to use SSH port forwarding with port 3333 (or any other local port you wish to use):

Gophish.config

[Gophish]
gp_host: https://127.0.0.1:3333
api_key: <YOUR_API_KEY>

[ipinfo.io]
ipinfo_token: <IPINFO_API_KEY>

[Google]
geolocate_key: <GEOLOCATE_API_KEY>

A Basic Command

python3 Goreport.py --id 26 --format excel

That would fetch the results of campaign 26 from https://localhost:3333/api/campaigns/26/?api_key=<Your_API_Key> and output the results to an xlsx file.

Multiple IDs can be provided at one time for multiple reports. The IDs can be provided using a comma-separated list, a range, or both.

Example: python3 Goreport.py --id 26,29-33,54 --format csv

Changing Config Files

If you use multiple Gophish user accounts or servers, then you will have multiple API keys. To make it easier to switch between keys, Goreport's --config option enables you to override the default config file, gophish.config, with a config file you name. If this argument is provided with a valid, readable config file, Goreport will use it instead of gophish.config to setup the API connections.

You might use this option if you have, for example, three phishing servers running Gophish. You could setup three config files, each with a different Gophish API key, and then use them as needed.

Example: python3 Goreport.py --id 26,29-33,54 --format csv --config phish_server_2.config

Combining Reports

If you ran multiple campaigns using the same settings for different target groups, you may wish to run Goreport against these campaigns all at once and then combine the results into one report. This can be accomplished by adding Goreports --combine flag.

Example: python3 Goreport.py --id 26,29-33,54 --format excel --combine

This command would collect the results for campaigns 26, 29, 30, 31, 32, 33, and 54. Normally, Goreport would output seven xlsx files, but the addition of --combine tells Goreport to combine the results and output just one report as if they were all one large campaign.

Switching Report Output

Goreport can output either an Excel spreadsheet (xlsx) or a Word document (docx). There is also a "quick" report option. Simply select your preferred format using the --format command line argument, as shown above in the Sample Usage section. There is not much to say about the csv format.

The Word document is built from a template, template.docx. Place your template file, named template.docx, into the Goreport directory with the main script. Your template should include a table style you want to use and heading styles for Heading 1 and Heading 1. Name your preferred table style "Goreport" and setup your Heading 1 and 2 styles.

Feel free to create a custom style or use an existing style. The only thing that matters is a template.docx file exists and it has a "Goreport" table style.

To rename a style, right-click the style, select Modify Table Style, and set a new name.

The Excel option outputs a nicely formatted Excel workbook with multiple worksheets for the different collections of results and statistics. This is a nice option if you want to easily sort or filter result tables.

Finally, there is a "quick" option. This does not generate a report document. Instead of a report, it outputs basic information about the campaign to your terminal. This is handy for quickly checking campaign progress or referencing results after campaign completion.

Marking Campaigns as Complete

If you want to set the status of a campaign to "Complete" when you run your report, Goreport can help you do this automatically with the --complete flag. If you provide this flag, Goreport will use the API to mark each campaign ID as "Complete" to end the campaign and update the status in Gophish.

Additional Information

Gophish performs it's own geolocation lookups with IP addresses and returns latitude and longitude. This works alright, but may fail and return coordinates of 0,0 or may return old information.

Goreport has two options that might be used to improve location results. The first, and recommended option, is the ipinfo.io API. API access is free as long as you make less than 1,000 queries per 24 hour period. That should not be too difficult for a phishing campaign.

If an ipinfo.io API key is added to the config file Goreport will automatically use ipinfo.io to gather current geolocation information for each unique IP address.

The second option is the Google Maps API. Goreport v1.0 used the Maps API when it was free. Google now charges $0.005/request for the Geolocate API (as it is now called). If you would prefer to not use ipinfo.io, activate the Maps Geolocate API on a Google account and add the API key to the Goreport config file. Then add the --google flag to your Goreport command anytime you want Goreport to use the API to lookup Gophish's coordinates to get a formatted address.

Technical Information

If you'd like to review the code, here is a basic outline of the process:

Goreport.py uses Python 3 and the Command Line Interface Creation Kit (CLICK) library. When the script is run, a new Goreport object is created. The __init__ function for the Goreport class creates a connection to your Gophish server using the provided API key for authentication. Then the run() function is called.

Run() uses the command line options to kick-off reporting. A For loop is used to loop through all campaign IDs provided with --id. Your Gophish server is contacted for campaign details for each individual ID.

First, collect_all_campaign_info() is called to stash basic campaign information in variables. This includes data like the campaign's name, when it was run, its status, the SMTP server used, the template's name, and more.

Second, process_timeline_events() is called to get Gophish's timeline model for the ID. This includes the events recorded by Gophish. This function runs second because it fills-in some lists that are reviewed by process_results().

Third, process_results() is called to get Gophish's results model for the ID. This provides data like the number of targets in the campaign.

Goreport uses these steps to setup some lists to determine the basic results for the campaign, e.g. who was successfully sent an email, which recipients clicked a linked, and which recipients provided data.

With this foundation, Goreport can arrange the data in any number of ways for a report. At any time, the lists can be queried to check if a certain email address in the results model appears in the targets_clicked list to confirm if that recipient clicked a link. That can then kick-off a review of the timeline model to collect details. Gophish keeps the details like IP address and user-agent in the timeline model and basic information in the results model.

goreport's People

Contributors

chrismaddalena avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

goreport's Issues

Custom output folder

Hi @chrismaddalena,

In light of docker support (like #26) it would be nice to being able to customize the output folder so that one can easily create a volume to persist results after executing the tool.
I already implemented this in my fork. If you think this is a reasonable thing to add (3 lines) I will make a PR.

Thanks for this tool. I find it useful : )

E-mail opened has not been registered

First of all, thank you very much for everything you have done.

I've been trying to implement GoReport into our monthly reports of our phishing campaigns. I've managed to usually fix all the small bugs myself but not this one, as in the title mentioned, the e-mail opened row seems to be not shown correctly, as seen in the screenshot provided.
image
In my GoPhish admin server, it is shown, that the tracking image is working correctly and it is being registered as an e-mail opened.

Any idea why is it not working?

Thanks in advance.

Total miscalculation

Hello! Firstly, want to to thank you for cool tool. It is really convinient, but for me, I have huge problem with calcualtion of statistics. Say, GoPhish dashboard gives me 31 sent emails, one open and one clicked. It's real situation.
This is the output of goreport.

High Level Results
Total Targets: 31
The following totals indicate how many events of each type Gophish recorded:
Total Open Events: 0
Total Click Events: 1
Total Report Events: 0
Total Submitted Data Events: 0
The following totals indicate how many targets participated in each event type:
Individuals Who Opened: 0
Individuals Who Clicked: 3
Individuals Who Reported: 0
Individuals Who Submitted: 1

Recently I ran simultaneously 14 compaigns for the client, so I have pretty much of such examples. Can you help me to troubleshoot this, or maybe I do something totally wrong.
Also, I have feature request: the ability to join multiple GoPHish campaigns into one report. Say, you send several emails with different pretexts for the one client, and after completion you want one report, not several. It will be convenient.

Campaign ID None does not exist

When connecting to my gophish server, I get an error " Details: HTTPSConnectionPool(host='44.2xx.xx.55', port=3333): Max retries exceeded with url: /api/campaigns/50onnection: [Errno 110] Connection timed out')). Followed by: Success!
[!] Looks like campaign ID None does not exist! Skipping it...
[!] There was a problem processing campaign ID 50!
L.. Details: 'NoneType' object has no attribute 'timeline'
Issue was repeatable on a vanilla Ubuntu 20.04.5 and my kalli 2022.4 box. Interesting enough, I was able to get the code to work on my Windows machine using git for windows. Any recommendations?

All reports the location is coming as unknown

Hello, I'm using the tool to get custom reports. But in all reports the location is coming as unknown and the link was accessed from different places and all locations are as unknown.

image

pip3 required to install requirements

Hi,

On many linux disto default pip works for python 2.X.
Goreports requires python3 and pip3 must be installed to install correct modules for python3

On ubuntu, the following commands needs to be executed.

sudo apt-get install python3-pip
pip3 install -r requirements.txt

Thanks

confusing table

Can you rename the part with "Your template should include a table style you want to use and heading styles for Heading 1 and Heading 1. Name your preferred table style "Goreport" and setup your Heading 1 and 2 styles."

into "GoReport" ? it took me some time.

--complete skips the last campaign

Hi Chris,

I noticed that when using the --complete flag, Go report skips setting the last campaign in the list to complete and proceeds to generate the report. In this case campaign ID 25 does not get set to complete before the report starts getting generated.

image

Customizable Report Template? (Possible Idea)

Hello colleagues,

I was wondering if there is a way to customize my own report template using some kind of specific keywords or tags.
I just read the README.md and couldn't see this option.

I think this might be a great idea to implement.
There is a tool called "pwndoc" (Great reporting tool!) that has this kind of customizable template, I'm mentioning it to give you an idea of ​​how this can be done.

Compliments,
M4konnen

Some non ASCII characters are not encoded and script fails

I have some user's Full Names which were imported from a CSV file and the non ASCII charcters were turned into symbols. Specifically names with characters with tildes like the following character: é

The script will see non ASCII characters and fail, if possible could a fix be introduced to allow the script to skip the character or add a random character and continue to finish the report for later editing? The error I received was:

[!] There was a problem processing campaign ID 32!
L.. Details: 'ascii' codec can't encode character u'\ufffd' in position 16: ordinal not in range(128)

Quick search online says to use .encode() to encode a string instead of using str

Source: https://stackoverflow.com/questions/9942594/unicodeencodeerror-ascii-codec-cant-encode-character-u-xa0-in-position-20

Thank you,
JC

wrong column in the submitted data excel

Hi
In the line 924 of /lib/goreport.py must be 'worksheet.write(row, col+5, submitted_data, wrap_format)' instead of 'worksheet.write(row, col+1, submitted_data, wrap_format)'

Thanks.

Problem processing campaign ID - Errorno 22

[+] Processed detailed analysis for 198 of 201.
[+] Processed detailed analysis for 199 of 201.
[+] Processed detailed analysis for 200 of 201.
[+] Processed detailed analysis for 201 of 201.
[+] Finished writing detailed analysis...
[!] There was a problem processing campaign ID 689!
L.. Details: [Errno 22] Invalid argument: 'Gophish Results for Login\t.xlsx'

If I run the report in Word, the same result.
Any suggestions on how to fix this?

Enhancement request

First of all thanks for this wonderful tool. It really makes reporting a lot easier! The only thing that I'm missing here is that the position information isn't used in the tool. So for example, what % of position A opened the phishing mail and what % actually submitted data? This would be a nice addition to the tool as it is right now. Another great feature would be to automatically generate graphics in the Word template.

[Errno 2] No such file or directory

Hello. When I trying to generate report with format xlsx or docx, I have the following error at the end.

[+] Processed detailed analysis for 1040 of 1040.
[+] Finished writing detailed analysis...
[!] There was a problem processing campaign ID 14!
L.. Details: [Errno 2] No such file or directory: 'Gophish Results for Extend mailbox capacity / group 1.xlsx'`

When I try to do it with --format quick, all is working. Maybe an issue in the generation of the output files ? does your script support special char like slash ( / ) ?

Clarify license

Hi!

First of all, thanks for some great software.

Which license, if any, is the code restricted under?
Please clarify and document in README.

Miscalculation of unique events

First of all, thanks for your useful tool!

When generating a report, I noticed a little error concerning the variable "total_unique_opened".

You should take into account the fact that if someone clicks on the link in the email, he should have opened the e-mail before (That's the logic applied in Gophish) even if he did not activate the display of the tracker in the email.

You should also take into account the fact that if someone submitted data, he implicitly opened the email and clicked on the link.

Cycl0pe

Enhancement Request

When processing a report for multiple campaigns we get the "warning" that this may take some time; however it looked like it was processing very fast until about half way then it looked like it hung for a while and then continued fast again. When it paused it looked like the whole program hung/crashed but after a few minutes it continued on. - It would be nice to have more on-screen reporting so we know it isn't crashed.

(SOLVED) There was a problem reading values from the gophish.config file!

Hello Everyone,

Hope you all have a great day.

I'v installed GoReport on the Host where GoPhish is running.

I have followed the instructions by creating a config file in the GoReport and GoPhish main directory

But i receive an error from GoReport.

There was a problem reading values from the gophish.config file!
L.. Details: No section: 'Gophish'

At this point i'm stuck, unfortunatelly i'm new with the API stuff never done this before.

Please let me know what i'm missing or what is the exact task when creating the config file (location,permission,etc..)

Any help is much appreciated, thank you in advance.

Input from the config file:

from gophish import Gophish

api_key = 'API_KEY'
api = Gophish(XXXXXXX8997f2219ad6b73b03dd64b4XXXXXXXe5cb54179241fe501a542XXXXX; host='https://X.0.0.X:33XX')

L.. Details: u'unknown' does not appear to be an IPv4 or IPv6 address

Received the following:

[!] There was a problem processing campaign ID 129!
L.. Details: u'unknown' does not appear to be an IPv4 or IPv6 address

Is there a place I can look for more detailed log information for what is happening? I saw the other issue regarding GeoMapping but not sure if this is in the same realm. I downloaded the requirements.txt file and updated my version in case the fix was in there already.

Let me know.

Thanks!

'NoneType' object is not iterable (I used EvilGoPhish)

Hello there,

I am using an alternative GoPhish project called "EvilGoPhish". Ive never had an issue with the Goreport using the regular GoPhish software and this is the first time I've tried to generate a report after running a phishing campaign using EvilGoPhish.

We recently ran a phishing campaign and I wanted to generate a report. The campaign has been 'completed' in EvilGoPhish. When I run the following command I get an error 'NoneType' object is not iterable.

  • The goreport.config file has the correct API which I can access when GoReport references the API Authorization Endpoint.
    The API Authorization endpoint is: https://xxxxxxxxxx.com:65333/api/campaigns/?api_key=bc7xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  • Campaign ID # 4 does indeed exist
  • I can see in the logs that the request to the API endpoint is successful
    time="2024-08-02T09:39:02-06:00" level=info msg="X.X.X.X - - [02/Aug/2024:09:39:02 -0600] "GET /api/campaigns/4 HTTP/1.1" 200 12447 "" "python-requests/2.24.0""
  • The --format quick seems to work as it displays the stats to the console, but it still says "looks like Campaign ID 4 does not exist" although it does
    Status: Completed
    Created: 15:36:33 on 2024-08-01
    Started: 15:34:00Z on 2024-08-01
    Completed: 14:57:06 on 2024-08-02

Total Targets: 56
Emails Sent: 0
IPs Seen: 42

Total Opened Events: 0
Total Click Events: 48
Total Submitted Data Events: 9

Individuals Who Opened: 42
Individuals Who Clicked: 42
Individuals Who Entered Data: 2
Individuals Who Reported the Email: 0

Any ideas? Could it have something to do with the EvilGoPhish vs GoPhish setup?

[+] A total of 1 campaign IDs have been provided for processing.
[+] GoReport will process the following campaign IDs: 4
[+] Now fetching results for Campaign ID 4 (1/1).
[+] Success!
[!] Looks like campaign ID 4 does not exist! Skipping it...
[+] Building the report -- you selected a Word/docx report.
[+] Looking for the template.docx to be used for the Word report.
[+] Template was found -- proceeding with report generation...
L.. Word reports can take a while if you had a lot of recipients.

[+] Finished writing high level summary...
[!] There was a problem processing campaign ID 4!
L.. Details: 'NoneType' object is not iterable

Gophish logs "Email open" and "Clicked link" immediately after the campaign is started, can Goreport solve this?

Hi, Thanks for the great tool you have made! But I have a problem where Gophish logs "Email open" and "Clicked link" immediately after the campaign is sent, is there an option or some config configuration that removes these false positives?
(For example remove/ignore the first 3 minutes or remove/ignore any addresses except Norway)

Under you can see an example where someone actually opened and clicked the link but it registers multiple times that shows in the high level results shown in the bottom. I started the campaign 2022-05-23 T10:56:46

image

False positive with real user later
image

Only false positive
image

High Level Results
Total Targets: 352

The following totals indicate how many events of each type Gophish recorded:
Total Open Events: 1644
Total Click Events: 780
Total Report Events: 0
Total Submitted Data Events: 24

The following totals indicate how many targets participated in each event type:
Individuals Who Opened: 351
Individuals Who Clicked: 351
Individuals Who Reported: 0
Individuals Who Submitted: 23

Python Lib Missing, But they aren't

cli output:
[[email protected]]# python GoReport.py --id 189 --format quick
[!] Could not import the GoPhish library! Make sure it is installed.
Run: python3 -m pip intall gophish
Test it by running python3 and then, in the Python prompt, typing from gophish import Gophish.

GoPhish library is installed. Verified by running the pip -r install requirements.txt again. Seemed to work fine last time I used it. Only change is that I have patched the system it is on. Are there any known issue with the latest CentOS patches and the application. I don't run it at python3 just python....is that possible an issue now?

Thanks.

Error with campaign ID when generating report

[+] A total of 1 campaign IDs have been provided for processing.
[+] GoReport will process the following campaign IDs: 88
[+] Now fetching results for Campaign ID 88 (1/1).
[!] There was a problem fetching this campaign ID's details. Make sure your URL and API key are correct. Check HTTP vs HTTPS!
L.. Details: super() takes at least 1 argument (0 given)
[+] Success!
[!] Looks like campaign ID None does not exist! Skipping it...
[!] There was a problem processing campaign ID 88!
L.. Details: 'NoneType' object has no attribute 'timeline'

Any suggestions on how to fix this?
btw, both url and id are correct and im running http.

No Error Reasoning

I am running a campaign report that has 157 "users" however I get a,

" [!] There was a problem processing campaign ID *** " L.. Details: 'location'

I am not sure why this is happening except that maybe I am hitting the thresh hold request through the IP location API's. Is there a way to tell it to slow down? Like I see it says 50 requests a second and that there seems to be an issue with getting ip locations... Thoughts / Help? Attaching a photo as well.
screen shot 2017-11-06 at 11 36 25 am

Encoding issues

Hi there,

seems like there is a bug with encoding somewhere. All I get is the error below. From what I know, there are no unicode characters in the source.

Any ideas on how to solve this?

Thanks!

[+] Connecting to GoPhish at https://10.XXX.XXX.XXX:3333
L.. The API Authorization endpoint is: https://10.XXX.XXX.XXX:3333/api/campaigns/?api_key=XXX
[+] A total of 1 campaign IDs have been provided for processing.
[+] GoReport will process IDs 3
()
[+] Now fetching results for Campaign ID 3 (1/1).
[+] Success!
[+] Building the report -- you selected a csv report.
[!] There was a problem processing campaign ID 3!
L.. Details: 'ascii' codec can't encode characters in position 8-9: ordinal not in range(128)

Aggregating Reports

Is it possible to or will it ever be possible to aggregate reports from different campaigns? I would like to run several campaigns but compile all of the data into one report.

No module named 'gophish'

I try to run report command and get error :

Traceback (most recent call last):
File "GoReport.py", line 21, in
from gophish import gophish
ImportError: No module named 'gophish'

One campaign, multiple domains

Hi Chris, a.o:
I have run a large campaign, with 16K users and multiple domain names.
How can is use Goreport to only generated the csv results for just one specified domain name?
Thx for yor great work!

Invalid API key

Hi,

my issue is that I keep getting the error: Details invalid API key when the GoReport tries to get the Data of the campaign. I have tried GoReport with two different GoPhish-es (both latest version), one was running directly on my computer and one was running on a server in the same domain and both times it cannot connect with the API key. I reset API key, reset the GoPhish server... not sure if im doing anything wrong or am I missing something?

Error creating report

Traceback (most recent call last):
File "GoReport.py", line 20, in
from lib import banners, goreport
File "/opt/gophish/goreport/lib/goreport.py", line 19, in
from user_agents import parse
ModuleNotFoundError: No module named 'user_agents'

All requirements have been installed, any idea how to fix this?

Thanks in advance

Execution stops at "We will now try fetching results for Campaign ID" with no errors thrown

When using the script I am seeing no errors and no results files are being created. This applies to DOCXs and CSVs and quick reports.

I can generate errors by using invalid campaigns IDs, so I know the script it working. I'd expect to see the message "We have successfully pulled the campaign details for ID .." but it looks like the script is not getting this far.

I have tried the API request in the browser using the same host and API Key as the config file, and I am seeing the JSON results in the browser, so I know the path is correct and authenticates.

I wonder if it is because the returned payload is quite large - I am returning campaigns with several 1000s of emails.

Export Report in Local Time instead of UTC format

First of all, i am grateful to have this nice tool. Thanks to Chris.

It will be great if the report can extract and project the actual GMT local time based on the gophish server time instead of UTC time format.

Thanks.

Ideas for improovments

Hi Chris,

First of all I'd like to thank you for your work on this script you've got some nice work done here :)
I have a few questions and maybe some ideas to enhance the coherence of gophish statistics

To put on some context, we've laucnhed a few phishing campaigns in my company,
The top managment were only interested by the click rate (mail opened / link clicked)

I think it would be interesting to have that statistic in the "high level results", I see two points which need some attention:

  • to this day you count the total of mail opened even if the same user has opened the mail several times as an exemple: i had a campain running with around 1k targets and i got 2k "opened" events

  • I guess it's the same thing with the "clicked link" event

What's your opinion on this subject ?

Regars,
Robin

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.