Use a REST API: Difference between revisions

m
(Adding a method to create venues.)
m (→‎{{header|Wren}}: Minor tidy)
 
(8 intermediate revisions by 5 users not shown)
Line 3:
 
<ol>
<li>GetCreate a 'get' function for the API, that can be used to get a list of events for example.</li>
<li>Create a 'post' function for the API, that can be used to create a new venue or event for example.</li>
<li>Submit events</li>
</ol>
 
Using the [http://www.meetup.com/meetup_api/ Meetup.com API].
 
Both functions take two parameters, 'details' and 'url'. Details is an object containing required and optional arguments specified by the API's requirement (Example, [http://www.meetup.com/meetup_api/docs/2/open_events/ open events] requires at least one detail). The 'url' supplied informs the get/post method what part of the API to ping (Example, valid URLs for 'get' could be ['/2/open_events' http://www.meetup.com/meetup_api/docs/2/open_events/] or ['/comments' http://www.meetup.com/meetup_api/docs/comments/]).
 
Some posting features are paid, such as creating an event. [Editing member details http://www.meetup.com/meetup_api/docs/2/member/#edit] for example, is an example of a free 'post' API.
 
An API key is assumed to be supplied through an <code>api_key.txt</code> file.
Line 13 ⟶ 17:
Solutions should be implemented without any meetup.com helper libraries, to make it easier to translate to languages which don't have such helper libraries. However, examples that do use helper libraries may be provided as an addition.
 
This task was created through [https://www.google-melange.com/gci/task/view/google/gci2014/5820245222621184 Google Code-in].
 
 
=={{header|Go}}==
===Using the standard library===
{{incomplete|Go|This needs a way to submit events to Meetup.}}
<br>
<lang go>package main
Note that this version doesn't include code to submit events to Meetup.
<syntaxhighlight lang="go">package main
 
import (
Line 140 ⟶ 147:
fmt.Println("First event:\n", &evresp.Results[0])
}
}</langsyntaxhighlight>
{{out}}
<pre>
Line 151 ⟶ 158:
Description: <p><b>Beginners Lighting:</b> join us for this exciting workshop…
</pre>
<br>
===Using a third party library===
{{libheader|Meetup-client(for Go)}}
<br>
Note that this code is untested as you need a paid subscription to create events which I don't have.
<syntaxhighlight lang="go">package main
 
import (
"fmt"
"github.com/Guitarbum722/meetup-client"
"io/ioutil"
"log"
"net/url"
"strconv"
"strings"
"time"
)
 
var key string
 
func init() {
// Read an API key from the specified file.
const keyFile = "api_key.txt"
keydata, err := ioutil.ReadFile(keyFile)
if err != nil {
log.Fatal(err)
}
key = strings.TrimSpace(string(keydata))
}
 
func eventOptions(et map[string][]string, vals url.Values) {
for k, v := range et {
if len(v) < 1 {
break
}
switch k {
case meetup.GroupID:
vals.Add(meetup.GroupID, strings.Join(v, ","))
case meetup.GroupURLName:
vals.Add(meetup.GroupURLName, strings.Join(v, ","))
case meetup.EventName:
vals.Add(meetup.EventName, strings.Join(v, ","))
case meetup.Description:
vals.Add(meetup.Description, strings.Join(v, ","))
case meetup.EventTime:
vals.Add(meetup.EventTime, strings.Join(v, ","))
default:
// empty
}
}
}
 
func check(err error) {
if err != nil {
log.Fatal(err)
}
}
 
func main() {
// create client
c := meetup.NewClient(&meetup.ClientOpts{APIKey: key})
 
// get basic information for a particular group
const urlName = "Meetup-API-Testing"
groups, err := c.GroupByURLName([]string{urlName})
check(err)
g := groups.Groups[0]
fmt.Printf("Basic information for the %q group:\n", g.URLName)
fmt.Printf(" ID : %d\n", g.ID)
fmt.Printf(" Member count : %d\n", g.MemberCount)
fmt.Printf(" Organizer : %s\n", g.Organizer.Name)
fmt.Println()
 
// get a list of upcoming events for this group
events, err := c.EventsByGroup(urlName, []string{meetup.EventUpcoming}, false)
check(err)
for _, event := range events.Events {
fmt.Printf("Upcoming events for the %q group\n", g.URLName)
fmt.Printf(" ID : %s\n", event.ID)
fmt.Printf(" Name : %s\n", event.Name)
fmt.Printf(" Link : %s\n", event.Link)
fmt.Printf(" Venue : %s\n", event.Venue.Name)
fmt.Println()
}
 
// create an event for this group
d := time.Date(2020, time.April, 1, 18, 0, 0, 0, time.UTC)
eventDate := strconv.FormatInt((d.UnixNano() / 1000000), 10)
event, err := c.CreateEvent(eventOptions, map[string][]string{
meetup.GroupID: {strconv.Itoa(g.ID)},
meetup.GroupURLName: {urlName},
meetup.EventName: {"Test Meetup integration"},
meetup.Description: {"This is an event test."},
meetup.EventTime: {eventDate},
})
check(err)
fmt.Printf("The ID for the %q event is %s\n\n", event.Name, event.ID)
 
// delete the event just posted
err = c.DeleteEvent(event.ID)
check(err)
fmt.Printf("The %q event has been cancelled.\n", event.Name)
}</syntaxhighlight>
 
=={{header|Java}}==
Line 158 ⟶ 268:
EventGetter.java
 
<langsyntaxhighlight lang="java">package src;
 
import java.io.BufferedReader;
Line 216 ⟶ 326:
}
}</langsyntaxhighlight>
 
Main.java
<langsyntaxhighlight lang="java">/*
* In this class, You can see the diferent
* ways of asking for events.
Line 308 ⟶ 418:
}
 
}</langsyntaxhighlight>
 
=={{header|JavaScript}}==
Line 314 ⟶ 424:
Made on node js. Run using 'node filename.js'
 
<langsyntaxhighlight lang="javascript">var fs = require('fs');
var request = require('request');
 
Line 437 ⟶ 547:
console.log('Venue: ', venue, venue.id);
// Prints a venue ID that can be used to create a event
}, '/' + '{{ foodie-programmers }}' + '/venusvenues');
// This needs a valid urlname for the group
 
Line 457 ⟶ 567:
}, function(result) {
console.log('Event: ', result);
})</langsyntaxhighlight>
 
=={{header|Phix}}==
Uses eventzillaapi.net instead of meetup.com, since unlike the latter it can be done for free.
Unfortunately the API (V2) does not support creating events, so instead this shows how to use
a post method to toggle sales (but see note below).
<!--<syntaxhighlight lang="phix">(notonline)-->
<span style="color: #000080;font-style:italic;">--
-- demo\rosetta\Using_a_REST_API.exw
-- =================================
--</span>
<span style="color: #008080;">without</span> <span style="color: #008080;">js</span>
<span style="color: #008080;">include</span> <span style="color: #000000;">libcurl</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
<span style="color: #008080;">include</span> <span style="color: #000000;">builtins</span><span style="color: #0000FF;">\</span><span style="color: #000000;">json</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">base_url</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"https://www.eventzillaapi.net/api/v2/"</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">curl</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">NULL</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">pErrorBuffer</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">NULL</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">get_api_key</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">inifile</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #7060A8;">file_exists</span><span style="color: #0000FF;">(</span><span style="color: #000000;">inifile</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
<span style="color: #004080;">object</span> <span style="color: #000000;">lines</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">get_text</span><span style="color: #0000FF;">(</span><span style="color: #000000;">inifile</span><span style="color: #0000FF;">,</span><span style="color: #004600;">GT_LF_STRIPPED</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #004080;">sequence</span><span style="color: #0000FF;">(</span><span style="color: #000000;">lines</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">and</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">lines</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">1</span>
<span style="color: #008080;">and</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">lines</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">])=</span><span style="color: #000000;">40</span> <span style="color: #008080;">then</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">lines</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #7060A8;">crash</span><span style="color: #0000FF;">(</span><span style="color: #000000;">inifile</span> <span style="color: #0000FF;">&</span> <span style="color: #008000;">" not found or invalid"</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">query</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">url</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">sequence</span> <span style="color: #000000;">req</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">string</span> <span style="color: #000000;">method</span><span style="color: #0000FF;">=</span><span style="color: #008000;">"GET"</span><span style="color: #0000FF;">)</span>
<span style="color: #000080;font-style:italic;">-- initialize curl handle if required</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">curl</span><span style="color: #0000FF;">=</span><span style="color: #004600;">NULL</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">curl</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">curl_easy_init</span><span style="color: #0000FF;">()</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">pErrorBuffer</span><span style="color: #0000FF;">=</span><span style="color: #004600;">NULL</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">pErrorBuffer</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">allocate</span><span style="color: #0000FF;">(</span><span style="color: #000000;">CURL_ERROR_SIZE</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #7060A8;">curl_easy_setopt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">curl</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">CURLOPT_ERRORBUFFER</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">pErrorBuffer</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">else</span>
<span style="color: #000000;">curl_easy_reset</span><span style="color: #0000FF;">(</span><span style="color: #000000;">curl</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #000080;font-style:italic;">-- generate the POST data string
-- eg {"command","returnBalances",
-- "nonce","1515249747606"}
-- --&gt; "command=returnBalances&nonce=1515249747606"</span>
<span style="color: #004080;">string</span> <span style="color: #000000;">post_data</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">""</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">req</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">by</span> <span style="color: #000000;">2</span> <span style="color: #008080;">do</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">></span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span> <span style="color: #000000;">post_data</span> <span style="color: #0000FF;">&=</span> <span style="color: #008000;">"&"</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #004080;">string</span> <span style="color: #000000;">name</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">req</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">],</span> <span style="color: #000000;">v</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">req</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
<span style="color: #000000;">post_data</span> <span style="color: #0000FF;">&=</span> <span style="color: #000000;">name</span><span style="color: #0000FF;">&</span><span style="color: #008000;">"="</span><span style="color: #0000FF;">&</span><span style="color: #000000;">v</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">method</span><span style="color: #0000FF;">=</span><span style="color: #008000;">"POST"</span> <span style="color: #008080;">then</span>
<span style="color: #7060A8;">curl_easy_setopt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">curl</span><span style="color: #0000FF;">,</span> <span style="color: #004600;">CURLOPT_URL</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">base_url</span><span style="color: #0000FF;">&</span><span style="color: #000000;">url</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">curl_easy_setopt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">curl</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">CURLOPT_POSTFIELDS</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">post_data</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">else</span>
<span style="color: #000000;">url</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">base_url</span><span style="color: #0000FF;">&</span><span style="color: #000000;">url</span>
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">post_data</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">url</span> <span style="color: #0000FF;">&=</span> <span style="color: #008000;">"?"</span><span style="color: #0000FF;">&</span><span style="color: #000000;">post_data</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #7060A8;">curl_easy_setopt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">curl</span><span style="color: #0000FF;">,</span> <span style="color: #004600;">CURLOPT_URL</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">url</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">curl_easy_setopt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">curl</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">CURLOPT_HTTPGET</span><span style="color: #0000FF;">,</span> <span style="color: #004600;">true</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #000080;font-style:italic;">-- generate the extra headers</span>
<span style="color: #004080;">string</span> <span style="color: #000000;">api_key</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">get_api_key</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"api_key.txt"</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">headers</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">curl_slist_append</span><span style="color: #0000FF;">(</span><span style="color: #004600;">NULL</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"x-api-key: "</span><span style="color: #0000FF;">&</span><span style="color: #000000;">api_key</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">api_key</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">""</span> <span style="color: #000080;font-style:italic;">-- (generally good idea, avoid showing in ex.err)
-- (obvs. inlining get_api_key() call works too.)</span>
<span style="color: #7060A8;">curl_easy_setopt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">curl</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">CURLOPT_HTTPHEADER</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">headers</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">curl_easy_setopt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">curl</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">CURLOPT_SSL_VERIFYPEER</span><span style="color: #0000FF;">,</span> <span style="color: #004600;">false</span><span style="color: #0000FF;">)</span>
<span style="color: #000080;font-style:italic;">-- run the query</span>
<span style="color: #004080;">object</span> <span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">curl_easy_perform_ex</span><span style="color: #0000FF;">(</span><span style="color: #000000;">curl</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">headers</span><span style="color: #0000FF;">!=</span><span style="color: #004600;">NULL</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">curl_slist_free_all</span><span style="color: #0000FF;">(</span><span style="color: #000000;">headers</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">if</span> <span style="color: #004080;">integer</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
<span style="color: #000080;font-style:italic;">-- better error/retry handling probably required...</span>
<span style="color: #0000FF;">?{</span><span style="color: #008000;">"error"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">res</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">peek_string</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pErrorBuffer</span><span style="color: #0000FF;">),</span><span style="color: #7060A8;">curl_easy_strerror</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">)}</span>
<span style="color: #008080;">return</span> <span style="color: #004600;">false</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #004080;">object</span> <span style="color: #000000;">jres</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">parse_json</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">jres</span><span style="color: #0000FF;">={</span><span style="color: #000000;">JSON_INVALID</span><span style="color: #0000FF;">}</span> <span style="color: #008080;">then</span>
<span style="color: #000080;font-style:italic;">-- ditto...</span>
<span style="color: #008080;">return</span> <span style="color: #004600;">false</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">jres</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #000080;font-style:italic;">-- as per the task description (but I would swap the args and call query() direct).</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">get_events</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">details</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">string</span> <span style="color: #000000;">url</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">query</span><span style="color: #0000FF;">(</span><span style="color: #000000;">url</span><span style="color: #0000FF;">,</span><span style="color: #000000;">details</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">toggle_sales</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">details</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">string</span> <span style="color: #000000;">url</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">query</span><span style="color: #0000FF;">(</span><span style="color: #000000;">url</span><span style="color: #0000FF;">,</span><span style="color: #000000;">details</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"POST"</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #004080;">object</span> <span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">get_events</span><span style="color: #0000FF;">({</span><span style="color: #008000;">"status"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"live"</span><span style="color: #0000FF;">},</span><span style="color: #008000;">"events"</span><span style="color: #0000FF;">)</span>
<span style="color: #000080;font-style:italic;">--object res = get_events({},"events")</span>
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">print_json</span><span style="color: #0000FF;">(</span><span style="color: #008000;">""</span><span style="color: #0000FF;">,</span><span style="color: #000000;">res</span><span style="color: #0000FF;">))</span>
<span style="color: #004080;">string</span> <span style="color: #000000;">id</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"2138822407"</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- (see note)</span>
<span style="color: #000000;">status</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"true"</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">res</span><span style="color: #0000FF;">!={-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,{</span><span style="color: #008000;">`message`</span><span style="color: #0000FF;">,</span><span style="color: #008000;">`No events found`</span><span style="color: #0000FF;">}}</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">extract_json_field</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"events_live"</span><span style="color: #0000FF;">)</span>
<span style="color: #000080;font-style:italic;">-- res = extract_json_field(res,"events")</span>
<span style="color: #000000;">id</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"%d"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">extract_json_field</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">[</span><span style="color: #000000;">2</span><span style="color: #0000FF;">],</span><span style="color: #008000;">"id"</span><span style="color: #0000FF;">))</span>
<span style="color: #000000;">status</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">extract_json_field</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">[</span><span style="color: #000000;">2</span><span style="color: #0000FF;">],</span><span style="color: #008000;">"status"</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"id:%s, status:%s\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">id</span><span style="color: #0000FF;">,</span><span style="color: #000000;">status</span><span style="color: #0000FF;">})</span>
<span style="color: #000000;">status</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">status</span><span style="color: #0000FF;">=</span><span style="color: #008000;">"Live"</span><span style="color: #0000FF;">?</span><span style="color: #008000;">"false"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"true"</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">toggle_sales</span><span style="color: #0000FF;">({</span><span style="color: #008000;">"eventid"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">id</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"status"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">status</span><span style="color: #0000FF;">},</span><span style="color: #008000;">"events/togglesales"</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">print_json</span><span style="color: #0000FF;">(</span><span style="color: #008000;">""</span><span style="color: #0000FF;">,</span><span style="color: #000000;">res</span><span style="color: #0000FF;">))</span>
<!--</syntaxhighlight>-->
Note that toggling sales off makes the (manually created) event invisible to the API, even without
the {"status","live"} filter, hence I had to hard-code the event id to permit a second run to turn
it back on. Also as shown omitting said filter changes the field name on the returned results...
{{out}}
<pre>
{
"pagination":[
{
"offset":0,
"limit":20,
"total":1,
"category":""
}
],
"events_live":[
{
"id":2138822407,
"title":"Phix Programming in the park party",
"description":"Learn how to program while wearing gloves",
"currency":"GBP", // nb: unicode pound symbol replaced manually
"start_date":"2021-12-30T00:00:00",
"start_time":"14:00",
"end_date":"2021-12-30T00:00:00",
"end_time":"14:10",
"time_zone":"(GMT+0000) United Kingdom Time",
"tickets_sold":0,
"tickets_total":4,
"status":"Live",
"show_remaining":false,
"twitter_hashtag":"",
"utc_offset":"+00:00",
"invite_code":"",
"url":"https://events.eventzilla.net/e/phix-programming-in-the-park-party-2138822407",
"logo_url":"",
"bgimage_url":"https://s3.amazonaws.com/ezusrevent/party-small13.jpg",
"venue":"Acacia gardens, London, England, United Kingdom",
"dateid":2138353105,
"categories":"Class, Training, or Workshop",
"language":"en",
"description_html":"<p>Learn how to program while wearing gloves</p>",
"timezone_code":"GMT"
}
]
}
id:2138822407, status:Live
{
"eventstatus":"unpublished"
}
</pre>
Second/alternate run:
<pre>
{
"message":"No events found"
}
{
"eventstatus":"published"
}
</pre>
 
=={{header|Python}}==
Line 464 ⟶ 746:
 
eventGetter.py
<langsyntaxhighlight lang="python">#http://docs.python-requests.org/en/latest/
import requests
import json
Line 490 ⟶ 772:
def submitEvent(url_path,params):
r = requests.post(url_path, data=json.dumps(params))
print(r.text+" : Event Submitted")</langsyntaxhighlight>
 
main.py
<langsyntaxhighlight lang="python">import eventGetter as eg
import json
 
Line 608 ⟶ 890:
 
main()</langsyntaxhighlight>
 
=={{header|Wren}}==
{{trans|Go}}
{{libheader|WrenGo}}
{{libheader|Meetup-client(for Go)}}
{{libheader|Wren-date}}
An embedded program with a Go host and a translation of the second Go example so we can use its third party library to create events.
 
I did wonder whether it was worth the effort to do this task given that we're using a deprecated API and can't test creating events without a paid subscription which I don't have. However, from Wren's viewpoint, there are some points of interest relating to the use of WrenGo - notably passing Wren maps to Go - which may be a useful reference for the future.
<syntaxhighlight lang="wren">/* Use_a_REST_API.wren */
 
import "./date" for Date
 
class Meetup {
static groupId { "group_id" }
static groupUrlName { "group_urlname" }
static eventName { "name" }
static description { "description" }
static eventTime { "time" }
static eventUpcoming { "upcoming" }
 
foreign static getKey(fileName)
}
 
foreign class Client {
construct new(clientOpts) {}
 
groupByUrlName(urlName) { Group.new(this, urlName) }
 
eventsByGroup(urlName, status, desc) { Events.new(this, urlName, status, desc) }
 
createEvent(o) { Event.new(this, o) }
 
foreign deleteEvent(eventId)
}
 
foreign class Group {
construct new(client, urlName) {}
 
foreign urlName
foreign groupId
foreign memberCount
foreign organizerName
}
 
foreign class Event {
construct new(client, o) {}
 
foreign eventName
foreign eventId
}
 
foreign class Events {
construct new(client, urlName, status, desc) {}
 
foreign eventsCount
foreign eventsId(index)
foreign eventsName(index)
foreign eventsLink(index)
foreign venueName(index)
}
 
var keyFile = "api_key.txt"
var key = Meetup.getKey(keyFile)
var c = Client.new(key)
 
// get basic information for a particular group
var urlName = "Meetup-API-Testing"
var g = c.groupByUrlName(urlName)
System.print("Basic information for the %(g.urlName) group:")
System.print(" ID : %(g.groupId)")
System.print(" Member count : %(g.memberCount)")
System.print(" Organizer : %(g.organizerName)")
 
// get a list of upcoming events for this group
var events = c.eventsByGroup(urlName, Meetup.eventUpcoming, false)
System.print("Upcoming events for the %(g.urlName) group")
for (i in 0...events.eventsCount) {
System.print(" ID : %(events.eventsId(i))")
System.print(" Name : %(events.eventsName(i))")
System.print(" Link : %(events.eventsLink(i))")
System.print(" Venue : %(events.venueName(i))")
System.print()
}
 
// create an event for this group
var eventDate = (Date.new(2022, 4, 1, 18, 0, 0, 0, "UTC").unixTime * 1000).toString
var o = {
Meetup.groupId: g.groupId.toString,
Meetup.groupUrlName: urlName,
Meetup.eventName: "Test Meetup integration",
Meetup.description: "This is an event test.",
Meetup.eventTime: eventDate
}
 
var event = c.createEvent(o)
System.print("The ID for the %(event.eventName) event is %(event.eventId)\n")
 
// delete the event just posted
c.deleteEvent(event.eventId)
System.print("The %(event.eventName) event has been cancelled.\n")</syntaxhighlight>
<br>
We now embed this in the following Go program and build it. To run it, you will need the necessary authorization, a paid subscription and, of course, non-fictitious data.
<syntaxhighlight lang="go">/* go build Use_a_REST_API.go */
 
package main
 
import (
"github.com/Guitarbum722/meetup-client"
"github.com/Guitarbum722/meetup-client/models"
wren "github.com/crazyinfin8/WrenGo"
"io/ioutil"
"log"
"net/url"
"strings"
)
 
type any = interface{}
 
func eventOptions(et map[string][]string, vals url.Values) {
for k, v := range et {
if len(v) < 1 {
break
}
switch k {
case meetup.GroupID:
vals.Add(meetup.GroupID, strings.Join(v, ","))
case meetup.GroupURLName:
vals.Add(meetup.GroupURLName, strings.Join(v, ","))
case meetup.EventName:
vals.Add(meetup.EventName, strings.Join(v, ","))
case meetup.Description:
vals.Add(meetup.Description, strings.Join(v, ","))
case meetup.EventTime:
vals.Add(meetup.EventTime, strings.Join(v, ","))
default:
// empty
}
}
}
 
func check(err error) {
if err != nil {
log.Fatal(err)
}
}
 
func getKey(vm *wren.VM, parameters []any) (any, error) {
keyFile := parameters[1].(string)
keydata, err := ioutil.ReadFile(keyFile)
check(err)
key := strings.TrimSpace(string(keydata))
return key, nil
}
 
func newClient(vm *wren.VM, parameters []any) (any, error) {
key := parameters[1].(string)
c := meetup.NewClient(&meetup.ClientOpts{APIKey: key})
return &c, nil
}
 
func deleteEvent(vm *wren.VM, parameters []any) (any, error) {
handle := parameters[0].(*wren.ForeignHandle)
ifc, _ := handle.Get()
c := ifc.(*meetup.Clienter)
eventId := parameters[1].(string)
err := (*c).DeleteEvent(eventId)
check(err)
return nil, nil
}
 
func newGroup(vm *wren.VM, parameters []any) (any, error) {
handle := parameters[1].(*wren.ForeignHandle)
ifc, _ := handle.Get()
c := ifc.(*meetup.Clienter)
urlName := parameters[2].(string)
groups, err := (*c).GroupByURLName([]string{urlName})
check(err)
if len(groups.Groups) == 0 {
log.Fatalf("There are no groups for the url name '%s'.\n", urlName)
}
return &(groups.Groups[0]), nil
}
 
func urlName(vm *wren.VM, parameters []any) (any, error) {
handle := parameters[0].(*wren.ForeignHandle)
ifc, _ := handle.Get()
g := ifc.(**models.Group)
return (**g).URLName, nil
}
 
func groupId(vm *wren.VM, parameters []any) (any, error) {
handle := parameters[0].(*wren.ForeignHandle)
ifc, _ := handle.Get()
g := ifc.(**models.Group)
return (**g).ID, nil
}
 
func memberCount(vm *wren.VM, parameters []any) (any, error) {
handle := parameters[0].(*wren.ForeignHandle)
ifc, _ := handle.Get()
g := ifc.(**models.Group)
return (**g).MemberCount, nil
}
 
func organizerName(vm *wren.VM, parameters []any) (any, error) {
handle := parameters[0].(*wren.ForeignHandle)
ifc, _ := handle.Get()
g := ifc.(**models.Group)
return (**g).Organizer.Name, nil
}
 
func newEvent(vm *wren.VM, parameters []any) (any, error) {
handle := parameters[1].(*wren.ForeignHandle)
ifc, _ := handle.Get()
c := ifc.(*meetup.Clienter)
mhandle := parameters[2].(*wren.MapHandle)
o := make(map[string][]string)
keys := []string{
meetup.GroupID, meetup.GroupURLName, meetup.EventName,
meetup.Description, meetup.EventTime,
}
for _, key := range keys {
s, err := mhandle.Get(key)
check(err)
o[key] = []string{s.(string)}
}
event, err2 := (*c).CreateEvent(eventOptions, o)
check(err2)
return &event, nil
}
 
func eventId(vm *wren.VM, parameters []any) (any, error) {
handle := parameters[0].(*wren.ForeignHandle)
ifc, _ := handle.Get()
event := ifc.(**models.Event)
return (**event).ID, nil
}
 
func eventName(vm *wren.VM, parameters []any) (any, error) {
handle := parameters[0].(*wren.ForeignHandle)
ifc, _ := handle.Get()
event := ifc.(**models.Event)
return (**event).Name, nil
}
 
func newEvents(vm *wren.VM, parameters []any) (any, error) {
handle := parameters[1].(*wren.ForeignHandle)
ifc, _ := handle.Get()
c := ifc.(*meetup.Clienter)
urlName := parameters[2].(string)
status := parameters[3].(string)
desc := parameters[4].(bool)
events, err := (*c).EventsByGroup(urlName, []string{status}, desc)
check(err)
return &events, nil
}
 
func eventsCount(vm *wren.VM, parameters []any) (any, error) {
handle := parameters[0].(*wren.ForeignHandle)
ifc, _ := handle.Get()
events := ifc.(**models.Events)
return len((**events).Events), nil
}
 
func eventsId(vm *wren.VM, parameters []any) (any, error) {
handle := parameters[0].(*wren.ForeignHandle)
ifc, _ := handle.Get()
events := ifc.(**models.Events)
index := int(parameters[1].(float64))
return (**events).Events[index].ID, nil
}
 
func eventsName(vm *wren.VM, parameters []any) (any, error) {
handle := parameters[0].(*wren.ForeignHandle)
ifc, _ := handle.Get()
events := ifc.(**models.Events)
index := int(parameters[1].(float64))
return (**events).Events[index].Name, nil
}
 
func eventsLink(vm *wren.VM, parameters []any) (any, error) {
handle := parameters[0].(*wren.ForeignHandle)
ifc, _ := handle.Get()
events := ifc.(**models.Events)
index := int(parameters[1].(float64))
return (**events).Events[index].Link, nil
}
 
func venueName(vm *wren.VM, parameters []any) (any, error) {
handle := parameters[0].(*wren.ForeignHandle)
ifc, _ := handle.Get()
events := ifc.(**models.Events)
index := int(parameters[1].(float64))
return (**events).Events[index].Venue.Name, nil
}
 
func moduleFn(vm *wren.VM, name string) (string, bool) {
if name != "meta" && name != "random" && !strings.HasSuffix(name, ".wren") {
name += ".wren"
}
return wren.DefaultModuleLoader(vm, name)
}
 
func main() {
cfg := wren.NewConfig()
cfg.LoadModuleFn = moduleFn
vm := cfg.NewVM()
 
meetupMethodMap := wren.MethodMap{
"static getKey(_)": getKey,
}
 
clientMethodMap := wren.MethodMap{
"deleteEvent(_)": deleteEvent,
}
 
groupMethodMap := wren.MethodMap{
"urlName": urlName,
"groupId": groupId,
"memberCount": memberCount,
"organizerName": organizerName,
}
 
eventMethodMap := wren.MethodMap{
"eventId": eventId,
"eventName": eventName,
}
 
eventsMethodMap := wren.MethodMap{
"eventsCount": eventsCount,
"eventsId(_)": eventsId,
"eventsName(_)": eventsName,
"eventsLink(_)": eventsLink,
"venueName(_)": venueName,
}
 
classMap := wren.ClassMap{
"Meetup": wren.NewClass(nil, nil, meetupMethodMap),
"Client": wren.NewClass(newClient, nil, clientMethodMap),
"Group": wren.NewClass(newGroup, nil, groupMethodMap),
"Event": wren.NewClass(newEvent, nil, eventMethodMap),
"Events": wren.NewClass(newEvents, nil, eventsMethodMap),
}
 
module := wren.NewModule(classMap)
fileName := "Use_a_REST_API.wren"
vm.SetModule(fileName, module)
vm.InterpretFile(fileName)
vm.Free()
}</syntaxhighlight>
 
{{omit from|EasyLang}}
9,476

edits